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