Spec-Zone.ru › Python 3.14

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

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

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

Примечание

Если вам нужно анализировать ненадёжные или неаутентифицированные данные, см. раздел Безопасность 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 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/xml.dom.pulldom.html

Spec-Zone.ru

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