Содержание страницы
19.9. xml.dom.pulldom – Поддержка построения частичных DOM-деревьев¶xml.dom.pulldom – Support for building partial DOM trees
Исходный код: Lib/xml/dom/pulldom.py
Модуль xml.dom.pulldom предоставляет «pull-парсер», который также может, при необходимости, создавать фрагменты документа, доступные через DOM. Основная идея заключается в извлечении «событий» из потока входящего XML и их обработке. В отличие от SAX, который также использует событийно-ориентированную модель обработки с колбэками, пользователь pull-парсера отвечает за явное извлечение событий из потока и выполнение цикла по этим событиям до завершения обработки или возникновения ошибки.
Предупреждение
Модуль xml.dom.pulldom не является безопасным для обработки вредоносных данных. Если необходимо разобрать непроверенные или неаутентифицированные данные, см. XML-уязвимости.
Пример:
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)¶
Подкласс 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)¶
Возвращает DOMEventStream из переданных входных данных. stream_or_string может быть именем файла или объектом, похожим на файл. parser, если указан, должен быть объектом XmlReader. Эта функция изменяет обработчик документа парсера и включает поддержку пространств имен; остальные настройки парсера (например, установка резолвера сущностей) должны быть выполнены заранее.
Если XML находится в строке, можно использовать функцию parseString():
- xml.dom.pulldom.parseString(string, parser=None)¶
Возвращает DOMEventStream, представляющий (Unicode) строку string.
- xml.dom.pulldom.default_bufsize¶
Значение по умолчанию для параметра bufsize функции parse().
Значение этой переменной можно изменить до вызова parse(), и новое значение вступит в силу.
19.9.1. Объекты DOMEventStream¶DOMEventStream Objects
- class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)¶
- getEvent()¶
Возвращает кортеж, содержащий event и текущий node в виде xml.dom.minidom.Document, если event равно START_DOCUMENT; в виде xml.dom.minidom.Element, если event равно START_ELEMENT или END_ELEMENT; или в виде xml.dom.minidom.Text, если event равно CHARACTERS. Текущий узел не содержит информации о своих дочерних элементах, если не был вызван expandNode().
- expandNode(node)¶
Расширяет всех потомков node в node. Пример:
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': # Следующий оператор выводит только '<p/>' print(node.toxml()) doc.exandNode(node) # Следующий оператор выводит узел со всеми его дочерними элементами '<p>Some text <div>and more</div></p>' print(node.toxml())
- reset()¶