Skip to main content

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

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


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

警告

xml.dom.pulldom 模块对于恶意构造的数据不安全。如果需要解析不受信任或未经身份验证的数据,请参阅 XML漏洞

例:

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

bufsize 参数的默认值为 parse()

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

20.8.1. DOMEventStream对象

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

如果事件等于 START_DOCUMENT,则返回包含 event 和当前 node 的元组作为 xml.dom.minidom.Document,如果事件等于 START_ELEMENTEND_ELEMENT,则返回 xml.dom.minidom.Element,如果事件等于 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()