Spec-Zone.ru › Python 3.12

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

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

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

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

Модуль xml.dom.pulldom не защищён от вредоносно сформированных данных. Если вам нужно анализировать данные, которым нельзя доверять или подлинность которых не подтверждена, см. раздел Уязвимости 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_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, представляющий строку 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/xml.dom.pulldom.html

Spec-Zone.ru

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