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, который представляет (Unicode) строку.

xml.dom.pulldom.default_bufsize

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

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

Объекты DOMEventStream

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()

© 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