xml.dom.pulldom.md
1> **Источник:** https://python-all.ru/3.14/library/xml.dom.pulldom.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `xml.dom.pulldom` – Поддержка построения частичных DOM-деревьев89**Исходный код:** [Lib/xml/dom/pulldom.py](https://python-all.ru/src/3.14/Lib/xml/dom/pulldom.py)1011---1213Модуль `xml.dom.pulldom` предоставляет «вытягивающий анализатор» (pull parser), который также может по запросу создавать фрагменты документа, доступные через DOM. Основная идея заключается в извлечении «событий» из входящего потока XML и их обработке. В отличие от SAX, который также использует событийно-ориентированную модель обработки вместе с колбэками, пользователь вытягивающего анализатора сам отвечает за явное извлечение событий из потока, циклически обрабатывая их до завершения обработки или возникновения ошибки.1415> **Примечание**16>17> Если требуется разобрать непроверенные или неаутентифицированные данные, см. [Безопасность XML](https://python-all.ru/3.14/library/xml.html#xml-security).1819Изменено в версии 3.7.1: Анализатор SAX больше не обрабатывает внешние сущности по умолчанию для повышения безопасности по умолчанию. Чтобы включить обработку внешних сущностей, передайте собственный экземпляр анализатора:2021```python22from xml.dom.pulldom import parse23from xml.sax import make_parser24from xml.sax.handler import feature_external_ges2526parser = make_parser()27parser.setFeature(feature_external_ges, True)28parse(filename, parser=parser)29```3031Пример:3233```python34from xml.dom import pulldom3536doc = pulldom.parse('sales_items.xml')37for event, node in doc:38 if event == pulldom.START_ELEMENT and node.tagName == 'item':39 if int(node.getAttribute('price')) > 50:40 doc.expandNode(node)41 print(node.toxml())42```4344`event` – это константа и может быть одной из:4546- `START_ELEMENT`47- `END_ELEMENT`48- `COMMENT`49- `START_DOCUMENT`50- `END_DOCUMENT`51- `CHARACTERS`52- `PROCESSING_INSTRUCTION`53- `IGNORABLE_WHITESPACE`5455`node` – это объект типа `xml.dom.minidom.Document`, `xml.dom.minidom.Element` или `xml.dom.minidom.Text`.5657Поскольку документ рассматривается как «плоский» поток событий, «дерево» документа неявно обходится, и нужные элементы находятся независимо от их глубины в дереве. Другими словами, не нужно учитывать иерархические вопросы, такие как рекурсивный поиск узлов документа, хотя если контекст элементов важен, потребуется либо поддерживать некоторое состояние, связанное с контекстом (т.е. помнить, где вы находитесь в документе в любой момент), либо использовать метод [`DOMEventStream.expandNode()`](https://python-all.ru/3.14/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream.expandNode) и переключиться на обработку через DOM.5859#### `class xml.dom.pulldom.PullDOM(documentFactory=None)`6061Подкласс [`xml.sax.handler.ContentHandler`](https://python-all.ru/3.14/library/xml.sax.handler.html#xml.sax.handler.ContentHandler).6263#### `class xml.dom.pulldom.SAX2DOM(documentFactory=None)`6465Подкласс [`xml.sax.handler.ContentHandler`](https://python-all.ru/3.14/library/xml.sax.handler.html#xml.sax.handler.ContentHandler).6667#### `xml.dom.pulldom.parse(stream_or_string, parser=None, bufsize=None)`6869Возвращает [`DOMEventStream`](https://python-all.ru/3.14/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream) из переданных входных данных. *stream\_or\_string* может быть именем файла или файлоподобным объектом. *parser*, если задан, должен быть объектом [`XMLReader`](https://python-all.ru/3.14/library/xml.sax.reader.html#xml.sax.xmlreader.XMLReader). Эта функция изменит обработчик документа анализатора и активирует поддержку пространств имён; другие настройки анализатора (например, установка разрешителя сущностей) должны быть выполнены заранее.7071Если у вас есть XML в строке, можно использовать функцию [`parseString()`](https://python-all.ru/3.14/library/xml.dom.pulldom.html#xml.dom.pulldom.parseString):7273#### `xml.dom.pulldom.parseString(string, parser=None)`7475Возвращает [`DOMEventStream`](https://python-all.ru/3.14/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream), представляющий (Unicode-)строку *string*.7677#### `xml.dom.pulldom.default_bufsize`7879Значение по умолчанию для параметра *bufsize* в [`parse()`](https://python-all.ru/3.14/library/xml.dom.pulldom.html#xml.dom.pulldom.parse).8081Значение этой переменной можно изменить до вызова [`parse()`](https://python-all.ru/3.14/library/xml.dom.pulldom.html#xml.dom.pulldom.parse), и новое значение вступит в силу.8283## Объекты DOMEventStream8485#### `class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)`8687Изменено в версии 3.11: Поддержка метода [`__getitem__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__getitem__) удалена.8889#### `getEvent()`9091Возвращает кортеж, содержащий *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.14/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream.expandNode).9293#### `expandNode(node)`9495Расширяет всех потомков *node* в *node*. Пример:9697```python98from xml.dom import pulldom99100xml = '<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'101doc = pulldom.parseString(xml)102for event, node in doc:103 if event == pulldom.START_ELEMENT and node.tagName == 'p':104 # Следующий оператор выводит только '<p/>'105 print(node.toxml())106 doc.expandNode(node)107 # Следующий оператор выводит узел со всеми его дочерними элементами '<p>Some text <div>and more</div></p>'108 print(node.toxml())109```110111#### `reset()`112