xml.dom.pulldom.md
1> **Источник:** https://python-all.ru/3.5/library/xml.dom.pulldom.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.8. [`xml.dom.pulldom`](https://python-all.ru/3.5/library/xml.dom.pulldom.html#module-xml.dom.pulldom) – Поддержка построения частичных DOM-деревьев89**Исходный код:** [Lib/xml/dom/pulldom.py](https://python-all.ru/src/3.5/Lib/xml/dom/pulldom.py)1011---1213Модуль [`xml.dom.pulldom`](https://python-all.ru/3.5/library/xml.dom.pulldom.html#module-xml.dom.pulldom) предоставляет «вытягивающий анализатор» (pull parser), который также может по запросу создавать фрагменты документа, доступные через DOM. Основная идея заключается в извлечении «событий» из входящего потока XML и их обработке. В отличие от SAX, который также использует событийно-ориентированную модель обработки вместе с колбэками, пользователь вытягивающего анализатора сам отвечает за явное извлечение событий из потока, циклически обрабатывая их до завершения обработки или возникновения ошибки.1415> **Предупреждение**16>17> Модуль [`xml.dom.pulldom`](https://python-all.ru/3.5/library/xml.dom.pulldom.html#module-xml.dom.pulldom) не защищён от вредоносных данных. Если нужно разобрать непроверенные или неаутентифицированные данные, см. [уязвимости XML](https://python-all.ru/3.5/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.5/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.5/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.5/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.5/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream) из переданных входных данных. *stream\_or\_string* может быть именем файла или файлоподобным объектом. *parser*, если задан, должен быть объектом [`XMLReader`](https://python-all.ru/3.5/library/xml.sax.reader.html#xml.sax.xmlreader.XMLReader). Эта функция изменит обработчик документа анализатора и активирует поддержку пространств имён; другие настройки анализатора (например, установка разрешителя сущностей) должны быть выполнены заранее.5859Если у вас есть XML в строке, можно использовать функцию [`parseString()`](https://python-all.ru/3.5/library/xml.dom.pulldom.html#xml.dom.pulldom.parseString):6061#### `xml.dom.pulldom.parseString(string, parser=None)`6263Возвращает [`DOMEventStream`](https://python-all.ru/3.5/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.5/library/xml.dom.pulldom.html#xml.dom.pulldom.parse).6869Значение этой переменной можно изменить до вызова [`parse()`](https://python-all.ru/3.5/library/xml.dom.pulldom.html#xml.dom.pulldom.parse), и новое значение вступит в силу.7071## 20.8.1. Объекты DOMEventStream7273#### `class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)`7475#### `getEvent()`7677Возвращает кортеж, содержащий *event* и текущий *node* как `xml.dom.minidom.Document`, если событие равно `START_DOCUMENT`, `xml.dom.minidom.Element`, если событие равно `START_ELEMENT` или `END_ELEMENT`, или `xml.dom.minidom.Text`, если событие равно `CHARACTERS`. Текущий узел не содержит информации о своих потомках, пока не вызван [`expandNode()`](https://python-all.ru/3.5/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream.expandNode).7879#### `expandNode(node)`8081Расширяет всех потомков *node* в *node*. Пример:8283```python84from xml.dom import pulldom8586xml = '<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'87doc = pulldom.parseString(xml)88for event, node in doc:89 if event == pulldom.START_ELEMENT and node.tagName == 'p':90 # Следующий оператор выводит только '<p/>'91 print(node.toxml())92 doc.expandNode(node)93 # Следующий оператор выводит узел со всеми его дочерними элементами '<p>Some text <div>and more</div></p>'94 print(node.toxml())95```9697#### `reset()`98