Spec-Zone.ru › Python 3.5

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

Исходный код: 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) строку.

xml.dom.pulldom.default_bufsize

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

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

1. Объекты DOMEventStream

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. Пример:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API