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

  • START_ELEMENT

  • END_ELEMENT

  • COMMENT

  • START_DOCUMENT

  • END_DOCUMENT

  • CHARACTERS

  • PROCESSING_INSTRUCTION

  • IGNORABLE_WHITESPACE

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

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

  • 类别 xml.dom.pulldom. PullDom(* documentFactory = None *)

  • 类别 xml.dom.pulldom. SAX2DOM(* documentFactory = None *)

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

    • 从给定的 Importing 返回DOMEventStream。 * stream_or_string *可以是文件名,也可以是类似文件的对象。 * parser *(如果提供)必须是XMLReader对象。此函数将更改解析器的文档处理程序并激活名称空间支持;其他解析器配置(例如设置实体解析器)必须事先完成。

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

  • xml.dom.pulldom. parseString(* string parser = None *)

  • xml.dom.pulldom. default_bufsize

      • bufsize *参数的默认值为parse()

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

DOMEventStream Objects

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

    • 如果事件等于START_DOCUMENT,则返回一个包含* event 和当前 node *作为xml.dom.minidom.Document的 Tuples;如果事件等于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 ( )