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

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


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

警告

这个 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

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

由于文档被视为事件的“平面”流,因此将隐式遍历文档“tree”,并找到所需元素,而不管它们在树中的深度如何。换句话说,我们不需要考虑层次结构问题,例如文档节点的递归搜索,尽管如果元素的上下文很重要,那么我们要么需要保持一些上下文相关的状态(即记住文档中任何给定点的位置),要么使用 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)

返回A DOMEventStream 从给定的输入。 stream_or_string 可以是文件名,也可以是类似文件的对象。 语法分析器 如果给定,则必须是 XMLReader 对象。此函数将更改解析器的文档处理程序并激活命名空间支持;其他解析器配置(如设置实体解析器)必须提前完成。

如果字符串中有XML,则可以使用 parseString() 改为函数:

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

返回A DOMEventStream 表示(Unicode) string .

xml.dom.pulldom.default_bufsize

的默认值 蟾蜍尺码 参数到 parse() .

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

domEventstream对象

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

3.8 版后已移除: 支持 sequence protocol 被贬低。

getEvent()

返回包含 事件 和当前 node 作为 xml.dom.minidom.Document 如果事件相等 START_DOCUMENTxml.dom.minidom.Element 如果事件相等 START_ELEMENTEND_ELEMENTxml.dom.minidom.Text 如果事件相等 CHARACTERS . 当前节点不包含有关其子节点的信息,除非 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()