xml.dom.pulldom
— 支持构建部分 DOM 树¶
xml.dom.pulldom
模块提供了一个“拉取解析器”,该解析器也可以在必要时生成文档的 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
node
是 xml.dom.minidom.Document
、xml.dom.minidom.Element
或 xml.dom.minidom.Text
类型的对象。
由于文档被视为“扁平”的事件流,因此会隐式遍历文档“树”,并且无论它们在树中的深度如何,都会找到所需的元素。换句话说,不需要考虑诸如递归搜索文档节点之类的分层问题,尽管如果元素的上下文很重要,则需要维护一些与上下文相关的状态(即记住在任何给定点文档中的位置),或者使用 DOMEventStream.expandNode()
方法并切换到与 DOM 相关的处理。
- class xml.dom.pulldom.PullDom(documentFactory=None)¶
- class xml.dom.pulldom.SAX2DOM(documentFactory=None)¶
- xml.dom.pulldom.parse(stream_or_string, parser=None, bufsize=None)¶
从给定的输入返回一个
DOMEventStream
。 stream_or_string 可以是文件名或类似文件的对象。 parser 如果给定,则必须是XMLReader
对象。 此函数将更改解析器的文档处理程序并激活命名空间支持;其他解析器配置(例如设置实体解析器)必须事先完成。
如果你的 XML 在字符串中,则可以使用 parseString()
函数代替
- xml.dom.pulldom.parseString(string, parser=None)¶
返回一个代表(Unicode)string 的
DOMEventStream
。
DOMEventStream 对象¶
- class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)¶
在 3.11 版本中更改: 移除了对
__getitem__()
方法的支持。- getEvent()¶
返回一个包含 event 和当前 node 的元组,如果 event 等于
START_DOCUMENT
,则为xml.dom.minidom.Document
,如果 event 等于START_ELEMENT
或END_ELEMENT
,则为xml.dom.minidom.Element
,如果 event 等于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()¶