xml.dom.pulldom — Поддержка создания частичных DOM-деревьев
Исходный код: Lib/xml/dom/pulldom.py
Модуль xml.dom.pulldom предоставляет «вытягивающий парсер», который также может быть запрошен для создания фрагментов документа, доступных через DOM, при необходимости. Основной концепцией является извлечение «событий» из потока входящего XML и обработка их. В отличие от SAX, который также использует модель обработки событий с обратными вызовами, пользователь вытягивающего парсера отвечает за явное извлечение событий из потока, циклически перебирая эти события до завершения обработки или возникновения ошибки.
Предупреждение
Модуль xml.dom.pulldom не защищен от зловредно сконструированных данных. Если вам нужно проанализировать недоверенные или неавторизованные данные, обратитесь к Уязвимости XML.
Изменено в версии 3.6.7: Парсер 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(), и новое значение вступит в силу.
20.8.1. Объекты DOMEventStream
-
class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize) -
-
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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/xml.dom.pulldom.html