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

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.

Пример:

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(), и новое значение вступит в силу.

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