xml.dom.pulldom.md
1> **Источник:** https://python-all.ru/3.7/library/xml.dom.pulldom.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`xml.dom.pulldom`](https://python-all.ru/3.7/library/xml.dom.pulldom.html#module-xml.dom.pulldom) – Поддержка построения частичных DOM-деревьев89**Исходный код:** [Lib/xml/dom/pulldom.py](https://python-all.ru/src/3.7/Lib/xml/dom/pulldom.py)1011---1213Модуль [`xml.dom.pulldom`](https://python-all.ru/3.7/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.7/library/xml.dom.pulldom.html#module-xml.dom.pulldom) не защищён от вредоносных данных. Если нужно разобрать непроверенные или неаутентифицированные данные, см. [уязвимости XML](https://python-all.ru/3.7/library/xml.html#xml-vulnerabilities).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.7/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.7/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.7/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.7/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream) из переданных входных данных. *stream\_or\_string* может быть именем файла или файлоподобным объектом. *parser*, если задан, должен быть объектом [`XMLReader`](https://python-all.ru/3.7/library/xml.sax.reader.html#xml.sax.xmlreader.XMLReader). Эта функция изменит обработчик документа анализатора и активирует поддержку пространств имён; другие настройки анализатора (например, установка разрешителя сущностей) должны быть выполнены заранее.7071Если у вас есть XML в строке, можно использовать функцию [`parseString()`](https://python-all.ru/3.7/library/xml.dom.pulldom.html#xml.dom.pulldom.parseString):7273#### `xml.dom.pulldom.parseString(string, parser=None)`7475Возвращает [`DOMEventStream`](https://python-all.ru/3.7/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.7/library/xml.dom.pulldom.html#xml.dom.pulldom.parse).8081Значение этой переменной можно изменить до вызова [`parse()`](https://python-all.ru/3.7/library/xml.dom.pulldom.html#xml.dom.pulldom.parse), и новое значение вступит в силу.8283## Объекты DOMEventStream8485#### `class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)`8687#### `getEvent()`8889Возвращает кортеж, содержащий *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.7/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream.expandNode).9091#### `expandNode(node)`9293Расширяет всех потомков *node* в *node*. Пример:9495```python96from xml.dom import pulldom9798xml = '<html><title>Foo</title> <p>Some text <div>and more</div></p> </html>'99doc = pulldom.parseString(xml)100for event, node in doc:101 if event == pulldom.START_ELEMENT and node.tagName == 'p':102 # Следующий оператор выводит только '<p/>'103 print(node.toxml())104 doc.expandNode(node)105 # Следующий оператор выводит узел со всеми его дочерними элементами '<p>Some text <div>and more</div></p>'106 print(node.toxml())107```108109#### `reset()`110