【问题标题】:From Sax to Dom with DTD (python)使用 DTD(python)从 Sax 到 Dom
【发布时间】:2010-12-26 20:04:42
【问题描述】:

我需要一个经过验证的带有 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。

有什么想法吗?

【问题讨论】:

    标签: python dom dtd sax


    【解决方案1】:

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

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

    另一方面:除非您真的需要一个 minidom 文档,否则最好还是留在 lxml 树上。 (您可以使用 xpath 等效于 getElementById,或查看 etree.XMLDTDIDetree.parseid

    【讨论】:

    • 嗯,我认为你是对的。重新分析并不是一个真正的选择。我在谷歌上搜索了一下 etree,看起来它在各个方面都比 minidom 好。谢谢!
    猜你喜欢
    • 2017-08-19
    • 2011-09-24
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多