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