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

来自菜鸟教程
Python/docs/3.7/library/xml.dom.pulldom
跳转至:导航、​搜索

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

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



xml.dom.pulldom 模块提供了一个“pull parser”,它也可以被要求在必要时生成文档的 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)
返回一个 DOMEventStream 表示(Unicode)string
xml.dom.pulldom.default_bufsize

bufsize 参数的默认值 parse()

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

DOMEventStream 对象

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

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