On this page
xml.dom.pulldom —支持构建部分 DOM 树
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.Document
,xml.dom.minidom.Element
或xml.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 *)- 返回代表(Unicode)* string *的DOMEventStream。
xml.dom.pulldom.
default_bufsize
-
- bufsize *参数的默认值为parse()。
-
可以在调用parse()之前更改此变量的值,新值将生效。
DOMEventStream Objects
-
- class *
xml.dom.pulldom.
DOMEventStream
(* stream , parser , bufsize *)
- 从 3.8 版开始不推荐使用:不支持sequence protocol。
- class *
getEvent
( )- 如果事件等于
START_DOCUMENT
,则返回一个包含* event 和当前 node *作为xml.dom.minidom.Document
的 Tuples;如果事件等于START_ELEMENT
或END_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
( )