Документация Python неофициальный перевод
Содержание страницы

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. Объекты DOMEventStreamDOMEventStream 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()