xml.dom.pulldom —支持构建部分 DOM 树

源代码: Lib/xml/dom/pulldom.py


xml.dom.pulldom模块提供了一个“拉式解析器”,在必要时还可以要求它生成文档的 DOM 可访问片段。基本概念涉及从传入 XML 流中提取“事件”并进行处理。与还使用事件驱动处理模型和回调的 SAX 相比,提取解析器的用户负责从流中显式提取事件,循环处理这些事件,直到处理完成或发生错误情况为止。

Warning

xml.dom.pulldom模块不能安全防范恶意构建的数据。如果您需要解析不可信或未经身份验证的数据,请参见XML vulnerabilities

在版本 3.7.1 中进行了更改:默认情况下,SAX 解析器不再处理一般的外部实体以提高安全性。要启用对外部实体的处理,请在以下位置传递自定义解析器实例:

from xml.dom.pulldom import parse
from xml.sax import make_parser
from xml.sax.handler import feature_external_ges

parser = make_parser()
parser.setFeature(feature_external_ges, True)
parse(filename, parser=parser)

Example:

from xml.dom import pulldom

doc = pulldom.parse('sales_items.xml')
for event, node in doc:
    if event == pulldom.START_ELEMENT and node.tagName == 'item':
        if int(node.getAttribute('price')) > 50:
            doc.expandNode(node)
            print(node.toxml())

event是一个常数,可以是以下之一:

node是类型xml.dom.minidom.Documentxml.dom.minidom.Elementxml.dom.minidom.Text的对象。

由于将文档视为事件的“平坦”流,因此隐式遍历了文档“树”,并且无论其在树中的深度如何,都可以找到所需的元素。换句话说,虽然元素元素的上下文很重要,但是要么需要保持某种与上下文相关的状态(即记住一个元素在文档中的位置),就不必考虑诸如文档节点的递归搜索之类的分层问题。在任何给定的位置)或使用DOMEventStream.expandNode()方法并切换到与 DOM 相关的处理。

如果字符串中包含 XML,则可以改用parseString()函数:

可以在调用parse()之前更改此变量的值,新值将生效。

DOMEventStream Objects

from xml.dom import pulldom

xml = '<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'
doc = pulldom.parseString(xml)
for event, node in doc:
    if event == pulldom.START_ELEMENT and node.tagName == 'p':
        # Following statement only prints '<p/>'
        print(node.toxml())
        doc.expandNode(node)
        # Following statement prints node with all its children '<p>Some text <div>and more</div></p>'
        print(node.toxml())
首页