xml.dom.pulldom — Поддержка построения частичных деревьев DOM
Исходный код: Lib/xml/dom/pulldom.py
Модуль xml.dom.pulldom предоставляет «pull-парсер», который также можно попросить создавать доступные через DOM фрагменты документа, когда это необходимо. Основная идея заключается в извлечении «событий» из потока входящих данных XML и их обработке. В отличие от SAX, который также использует управляемую событиями модель обработки с обратными вызовами, пользователь pull-парсера сам отвечает за явное извлечение событий из потока и перебор этих событий до завершения обработки или возникновения ошибки.
Примечание
Если вам нужно анализировать ненадёжные данные или данные, подлинность которых не подтверждена, см. раздел Безопасность 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_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, представляющий строку string в кодировке Unicode.
-
xml.dom.pulldom.default_bufsize -
Значение по умолчанию параметра bufsize функции
parse().Значение этой переменной можно изменить перед вызовом
parse(); новое значение вступит в силу.
Объекты DOMEventStream
-
class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize) -
Изменено в версии 3.11: Поддержка метода
__getitem__()удалена.-
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': # 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()
-
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/xml.dom.pulldom.html