使用DTD(python)从Sax到Dom

使用DTD(python)从Sax到Dom,python,dom,dtd,sax,Python,Dom,Dtd,Sax,我需要一个带有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" encodin

我需要一个带有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>
从xml.dom导入minidom
从xml.dom.pulldom导入SAX2DOM
从lxml导入etree
导入lxml.sax
从StringIO导入StringIO
数据字符串“”\
]>正文
"""
#解析器,使用vali。解析时
etree_parser=etree.XMLParser(dtd_验证=True,属性_默认值=True)
#解析它
sax_tree=etree.parse(StringIO(数据字符串),etree_解析器);
handler=SAX2DOM();
lxml.sax.saxify(sax_树,handler);
domObject=handler.document;
打印domObject.getElementById(“nr_0”);
#不返回
打印minidom.parseString(数据字符串).getElementById(“nr_0”);
#返回
SAX2DOM似乎不会将DTD传递给dom。我忘了什么吗? 我已经读过,在构建dom之后不可能加载DTD


有什么想法吗?

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

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

另一方面:除非您真的需要minidom文档,否则最好只使用lxml树。(您可以使用xpath作为
getElementById
的等价物,或者查看
etree.XMLDTDID
etree.parseid

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

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

另一方面:除非您真的需要minidom文档,否则最好只使用lxml树。(您可以使用xpath作为
getElementById
的等价物,或者查看
etree.XMLDTDID
etree.parseid

Hmmm,我想您是对的。重新估价实际上不是一种选择。我在谷歌上搜索了一下etree,看起来它在各个方面都比minidom好。谢谢!嗯,我想你是对的。重新估价实际上不是一种选择。我在谷歌上搜索了一下etree,看起来它在各个方面都比minidom好。谢谢!