Документация Python неофициальный перевод

xml.dom.pulldom.md

96 строк · 7.5 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/xml.dom.pulldom.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.9. [`xml.dom.pulldom`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#module-xml.dom.pulldom) – Поддержка построения частичных DOM-деревьев89**Исходный код:** [Lib/xml/dom/pulldom.py](https://python-all.ru/src/3.2/Lib/xml/dom/pulldom.py)1011---1213Модуль [`xml.dom.pulldom`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#module-xml.dom.pulldom) предоставляет «pull-парсер», который также может, при необходимости, создавать фрагменты документа, доступные через DOM. Основная идея заключается в извлечении «событий» из потока входящего XML и их обработке. В отличие от SAX, который также использует событийно-ориентированную модель обработки с колбэками, пользователь pull-парсера отвечает за явное извлечение событий из потока и выполнение цикла по этим событиям до завершения обработки или возникновения ошибки.1415> **Предупреждение**16>17> Модуль [`xml.dom.pulldom`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#module-xml.dom.pulldom) не является безопасным для обработки вредоносных данных. Если необходимо разобрать непроверенные или неаутентифицированные данные, см. [*XML-уязвимости*](https://python-all.ru/3.2/library/xml.html#xml-vulnerabilities).1819Пример:2021```python22from xml.dom import pulldom2324doc = pulldom.parse('sales_items.xml')25for event, node in doc:26    if event == pulldom.START_ELEMENT and node.tagName == 'item':27        if int(node.getAttribute('price')) > 50:28            doc.expandNode(node)29            print(node.toxml())30```3132`event` – константа; она может принимать одно из следующих значений:3334- `START_ELEMENT`35- `END_ELEMENT`36- `COMMENT`37- `START_DOCUMENT`38- `END_DOCUMENT`39- `CHARACTERS`40- `PROCESSING_INSTRUCTION`41- `IGNORABLE_WHITESPACE`4243`node` – это объект типа `xml.dom.minidom.Document`, `xml.dom.minidom.Element` или `xml.dom.minidom.Text`.4445Поскольку документ обрабатывается как «плоский» поток событий, «дерево» документа неявно обходится, и нужные элементы находятся независимо от их глубины в дереве. Иными словами, не требуется учитывать иерархические аспекты, такие как рекурсивный поиск узлов документа, хотя если контекст элементов важен, необходимо либо поддерживать некоторое состояние, связанное с контекстом (то есть помнить, где вы находитесь в документе в любой момент времени), либо использовать метод [`DOMEventStream.expandNode()`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream.expandNode) и переключиться на DOM-ориентированную обработку.4647#### `class xml.dom.pulldom.PullDom(documentFactory=None)`4849Подкласс [`xml.sax.handler.ContentHandler`](https://python-all.ru/3.2/library/xml.sax.handler.html#xml.sax.handler.ContentHandler).5051#### `class xml.dom.pulldom.SAX2DOM(documentFactory=None)`5253Подкласс [`xml.sax.handler.ContentHandler`](https://python-all.ru/3.2/library/xml.sax.handler.html#xml.sax.handler.ContentHandler).5455#### `xml.dom.pulldom.parse(stream_or_string, parser=None, bufsize=None)`5657Возвращает [`DOMEventStream`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream) из переданных входных данных. *stream\_or\_string* может быть именем файла или объектом, похожим на файл. *parser*, если указан, должен быть объектом `XmlReader`. Эта функция изменяет обработчик документа парсера и включает поддержку пространств имен; остальные настройки парсера (например, установка резолвера сущностей) должны быть выполнены заранее.5859Если XML находится в строке, можно использовать функцию [`parseString()`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#xml.dom.pulldom.parseString):6061#### `xml.dom.pulldom.parseString(string, parser=None)`6263Возвращает [`DOMEventStream`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream), представляющий (Unicode) строку *string*.6465#### `xml.dom.pulldom.default_bufsize`6667Значение по умолчанию для параметра *bufsize* функции [`parse()`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#xml.dom.pulldom.parse).6869Значение этой переменной можно изменить до вызова [`parse()`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#xml.dom.pulldom.parse), и новое значение вступит в силу.7071## 19.9.1. Объекты DOMEventStream7273#### `class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)`7475#### `getEvent()`7677Возвращает кортеж, содержащий *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()`](https://python-all.ru/3.2/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream.expandNode).7879#### `expandNode(node)`8081Расширяет всех потомков *node* в *node*. Пример:8283```python84xml = '<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'85doc = pulldom.parseString(xml)86for event, node in doc:87    if event == pulldom.START_ELEMENT and node.tagName == 'p':88        # Следующий оператор выводит только '<p/>'89        print(node.toxml())90        doc.exandNode(node)91        # Следующий оператор выводит узел со всеми его дочерними элементами '<p>Some text <div>and more</div></p>'92        print(node.toxml())93```9495#### `reset()`96