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

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


xml.dom.pulldom 模块提供了一个“拉取解析器”,它也可以根据需要生成文档中可供 DOM 访问的片段。基本概念是从传入的 XML 流中“拉取”事件并对其进行处理。与 SAX 也采用事件驱动的处理模型和回调函数不同,拉取解析器的用户负责从流中显式拉取事件,循环遍历这些事件,直到处理完成或出现错误情况。

警告

xml.dom.pulldom 模块无法抵御恶意构建的数据的攻击。如果您需要解析不受信任或未经身份验证的数据,请参阅 XML 漏洞

版本 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)

示例

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 是一个常量,可以是以下值之一

  • START_ELEMENT

  • END_ELEMENT

  • COMMENT

  • START_DOCUMENT

  • END_DOCUMENT

  • CHARACTERS

  • PROCESSING_INSTRUCTION

  • IGNORABLE_WHITESPACE

nodexml.dom.minidom.Documentxml.dom.minidom.Elementxml.dom.minidom.Text 类型的对象。

由于文档被视为事件的“扁平”流,因此文档“树”被隐式遍历,并且无论所需元素在树中的深度如何,都可以找到它们。换句话说,您无需考虑层次结构问题,例如递归搜索文档节点,但如果元素的上下文很重要,则您需要维护一些与上下文相关的状态(即记住在任何给定点在文档中的位置),或者使用 DOMEventStream.expandNode() 方法并切换到与 DOM 相关的处理。

class xml.dom.pulldom.PullDom(documentFactory=None)

xml.sax.handler.ContentHandler 的子类。

class xml.dom.pulldom.SAX2DOM(documentFactory=None)

xml.sax.handler.ContentHandler 的子类。

xml.dom.pulldom.parse(stream_or_string, parser=None, bufsize=None)

从给定的输入返回一个 DOMEventStreamstream_or_string 可以是文件名,也可以是类文件对象。parser 如果给出,则必须是 XMLReader 对象。此函数将更改解析器的文档处理程序并激活命名空间支持;其他解析器配置(如设置实体解析器)必须事先完成。

如果您的 XML 在字符串中,则可以使用 parseString() 函数

xml.dom.pulldom.parseString(string, parser=None)

返回表示(Unicode)stringDOMEventStream

xml.dom.pulldom.default_bufsize

parse()bufsize 参数的默认值。

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

DOMEventStream 对象

class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)

版本 3.11 中的变化: 已移除对 __getitem__() 方法的支持。

getEvent()

返回一个元组,其中包含 event 和当前 node,如果 event 等于 START_DOCUMENT,则为 xml.dom.minidom.Document,如果 event 等于 START_ELEMENTEND_ELEMENT,则为 xml.dom.minidom.Element,如果 event 等于 CHARACTERS,则为 xml.dom.minidom.Text。当前节点不包含有关其子节点的信息,除非调用了 expandNode()

expandNode(node)

node 的所有子节点扩展到 node 中。示例

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())
reset()