xml.dom.pulldom — 支援構建部分 DOM 樹

原始碼: Lib/xml/dom/pulldom.py


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

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)

返回一個代表(Unicode)stringDOMEventStream

xml.dom.pulldom.default_bufsize

parse()bufsize 引數的預設值。

可以在呼叫 parse() 之前更改此變數的值,新值將生效。

DOMEventStream 物件

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

在 3.11 版本中更改: 移除了對 __getitem__() 方法的支援。

getEvent()

返回一個包含 event 和當前 node 的元組,如果 event 等於 START_DOCUMENT,則為 xml.dom.minidom.Document,如果 event 等於 START_ELEMENTEND_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()