xml.dom.pulldom
— 支援構建部分 DOM 樹¶
xml.dom.pulldom
模組提供了一個“拉取解析器”,在必要時也可以要求它生成文件的 DOM 可訪問片段。基本概念涉及從傳入的 XML 流中拉取“事件”並對其進行處理。與 SAX 不同的是,SAX 也採用事件驅動的處理模型和回撥,而拉取解析器的使用者需要負責顯式地從流中拉取事件,迴圈這些事件直到處理完成或發生錯誤情況。
備註
如果您需要解析不受信任或未經身份驗證的資料,請參閱 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,如果事件等於
START_DOCUMENT
則為xml.dom.minidom.Document
,如果事件等於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()¶