xml.dom.pulldom — Поддержка построения частичных деревьев DOM

Исходный код: Lib/xml/dom/pulldom.py


Модуль xml.dom.pulldom предоставляет «синтаксический анализатор», который также может быть запрошен для создания фрагментов документа, доступных для DOM, где это необходимо. Основная концепция заключается в извлечении «событий» из потока входящего XML и их обработке. В отличие от SAX, который также использует управляемую событиями модель обработки вместе с обратными вызовами, пользователь синтаксического анализатора pull отвечает за явное извлечение событий из потока, повторяя эти события до тех пор, пока обработка не будет завершена или не возникнет ошибка.

Предупреждение

Модуль xml.dom.pulldom не защищен от вредоносных данных. Если вам нужно проанализировать данные, которым нельзя доверять или которые не прошли проверку подлинности, обратитесь к Важно отметить, что для модулей в пакете требуется, чтобы был доступен хотя бы один синтаксический анализатор XML, совместимый с SAX. Синтаксический анализатор Expat включен в состав Python, поэтому модуль всегда будет доступен..

Изменено в версии 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_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) *.

xml.dom.pulldom.default_bufsize

Значение по умолчанию для параметра bufsize равно parse().

Значение этой переменной можно изменить перед вызовом parse(), и новое значение вступит в силу.

Поток домовых событий

class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)

Изменено в версии 3.11: Поддержка метода __getitem__() была удалена.

getEvent()

Поддержка метода xml.dom.minidom.Document была START_DOCUMENT удалена xml.dom.minidom.Element START_ELEMENT END_ELEMENT xml.dom.minidom.Text CHARACTERS expandNode() .

expandNode(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()
Вернуться на верх