xml.dom.pulldom– 支持构建部分DOM

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


xml.dom.pulldom模块提供“拉解析器”“这也可以用于在必要时生成DOM可访问的文档片段。基本概念涉及从传入的XML流中提取“事件”并对其进行处理。与SAX一起使用事件驱动的处理模型以及回调相比,拉解析器的用户负责显式地从流中提取事件,循环这些事件直到处理完成或发生错误情况.

警告

xml.dom.pulldom模块不能安全地防止恶意构造的数据。如果您需要解析不受信任的orunauthenticated数据,请参阅 XML漏洞.

在版本3.7.1中更改:默认情况下,SAX解析器不再处理常规外部实体以提高安全性默认。要启用外部实体的处理,请在以下位置传递自定义解析器实例:

from xml.dom.pulldom import parsefrom xml.sax import make_parserfrom xml.sax.handler import feature_external_gesparser = make_parser()parser.setFeature(feature_external_ges, True)parse(filename, parser=parser)

示例:

from xml.dom import pulldomdoc = 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.Document,xml.dom.minidom.Elementxml.dom.minidom.Text.

由于文档被视为“平面”事件流,因此隐式遍历文档“树”,并且无论树中的深度如何,都可以找到所需的元素。换句话说,人们不需要考虑分层问题,例如文档节点的递归搜索,尽管如果元素的上下文很重要,那么要么需要保持一些与上下文相关的状态(即,记住任何一个在文档中的位置))或使用DOMEventStream.expandNode()方法并切换到与DOM相关的处理.

class xml.dom.pulldom.PullDomdocumentFactory=None

的子类xml.sax.handler.ContentHandler.

class xml.dom.pulldom.SAX2DOMdocumentFactory=None

的子类xml.sax.handler.ContentHandler.

xml.dom.pulldom.parsestream_or_string, parser=None, bufsize=None

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

如果你在字符串中有XML,你可以使用parseString()功能改为:

xml.dom.pulldom.parseStringstring, parser=None

返回DOMEventStream代表(Unicode)string.

xml.dom.pulldom.default_bufsize

的默认值bufsize参数parse().

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

DO EventStream Objects

class xml.dom.pulldom.DOMEventStreamstream, parser, bufsize
getEvent

返回一个包含event当前nodexml.dom.minidom.Document如果事件等于START_DOCUMENT,xml.dom.minidom.Element如果事件等于START_ELEMENTEND_ELEMENTxml.dom.minidom.Text如果事件等于CHARACTERS。当前节点不包含有关其子节点的信息,除非expandNode()被称为

expandNodenode)

node的所有孩子扩大到node。例:

from xml.dom import pulldomxml = "<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

评论被关闭。