xml.dom.pulldom
— Поддержка построения частичных деревьев DOM¶
Исходный код: Lib/xml/dom/pulldom.py
Модуль xml.dom.pulldom
предоставляет «синтаксический анализатор», который также может быть запрошен для создания фрагментов документа, доступных для DOM, где это необходимо. Основная концепция заключается в извлечении «событий» из потока входящего XML и их обработке. В отличие от SAX, который также использует управляемую событиями модель обработки вместе с обратными вызовами, пользователь синтаксического анализатора pull отвечает за явное извлечение событий из потока, повторяя эти события до тех пор, пока обработка не будет завершена или не возникнет ошибка.
Предупреждение
Модуль xml.dom.pulldom
не защищен от вредоносных данных. Если вам нужно проанализировать данные, которым нельзя доверять или которые не прошли проверку подлинности, обратитесь к Важно отметить, что для модулей в пакете требуется, чтобы был доступен хотя бы один синтаксический анализатор XML, совместимый с SAX. Синтаксический анализатор Expat включен в состав Python, поэтому модуль всегда будет доступен..
Изменено в версии 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()
, и новое значение вступит в силу.
Поток домовых событий¶
- 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()¶