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_ELEMENTEND_ELEMENTCOMMENTSTART_DOCUMENTEND_DOCUMENTCHARACTERSPROCESSING_INSTRUCTIONIGNORABLE_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) string.
-
xml.dom.pulldom.default_bufsize -
Значение по умолчанию для параметра bufsize для
parse().Значение этой переменной можно изменить перед вызовом
parse(), и новое значение вступит в силу.
Объекты DOMEventStream
-
class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize) -
Устарело начиная с версии 3.8: Поддержка
sequence protocolустарела.-
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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/xml.dom.pulldom.html