Spec-Zone.ru › Python 3.8

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.8: Поддержка sequence protocol устарела.

getEvent()

Возвращает кортеж, содержащий event и текущий узел, как 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)

Расширяет всех потомков узла в узел. Пример:

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

Spec-Zone.ru

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