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 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/xml.dom.pulldom.html