gpt4 book ai didi

python - 使用 DTD 从 Sax 到 Dom (python)

转载 作者:太空宇宙 更新时间:2023-11-03 19:38:46 25 4
gpt4 key购买 nike

我需要一个带有 DTD 的经过验证的 DomTree(以使用 getElementById)。验证和解析工作正常,但 dom 无法正常工作:

from xml.dom import minidom 
from xml.dom.pulldom import SAX2DOM
from lxml import etree
import lxml.sax
from StringIO import StringIO

data_string = """\
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo (bar)*>
<!ELEMENT bar (#PCDATA)>
<!ATTLIST bar id ID #REQUIRED>]><foo><bar id="nr_0">text</bar></foo>
"""

#parser, with vali. at parsing
etree_parser = etree.XMLParser(dtd_validation=True,attribute_defaults=True)
#parse it
sax_tree = etree.parse(StringIO(data_string),etree_parser);
handler = SAX2DOM();
lxml.sax.saxify(sax_tree,handler);
domObject = handler.document;

print domObject.getElementById("nr_0");
#returns None

print minidom.parseString(data_string).getElementById("nr_0");
#returns <DOM Element: bar at 0x7f36b77dc0e0>

SAX2DOM 似乎不会将 DTD 传递给 dom。我是不是忘记了什么?我读到在 dom 构建后不可能加载 DTD。

有什么想法吗?

最佳答案

据我所知:SAX DTD 事件不是由 ContentHandler 处理的,而是由 DTDHandler 处理的。 ,这是您可以在 sax 解析器 (XMLReader) 上设置的属性。这意味着如果不序列化和重新分析文档就无法执行此操作。

validated_string = etree.tostring(tree)
domDocument = minidom.parseString(validated_string)

另一方面:除非您确实需要一个 minidom 文档,否则最好只使用 lxml 树。 (您可以使用 xpath 相当于 getElementById,或者查看 etree.XMLDTDIDetree.parseid)

关于python - 使用 DTD 从 Sax 到 Dom (python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1907740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com