> **Источник:** https://python-all.ru/3.16/library/xml.dom.pulldom.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `xml.dom.pulldom` – Поддержка построения частичных DOM-деревьев

**Исходный код:** [Lib/xml/dom/pulldom.py](https://python-all.ru/src/main/Lib/xml/dom/pulldom.py)

---

Модуль `xml.dom.pulldom` предоставляет «вытягивающий анализатор» (pull parser), который также может по запросу создавать фрагменты документа, доступные через DOM. Основная идея заключается в извлечении «событий» из входящего потока XML и их обработке. В отличие от SAX, который также использует событийно-ориентированную модель обработки вместе с колбэками, пользователь вытягивающего анализатора сам отвечает за явное извлечение событий из потока, циклически обрабатывая их до завершения обработки или возникновения ошибки.

> **Примечание**
>
> Если требуется разобрать непроверенные или неаутентифицированные данные, см. [Безопасность XML](https://python-all.ru/3.16/library/xml.html#xml-security).

Изменено в версии 3.7.1: Анализатор SAX больше не обрабатывает внешние сущности по умолчанию для повышения безопасности по умолчанию. Чтобы включить обработку внешних сущностей, передайте собственный экземпляр анализатора:

```python
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)
```

Пример:

```python
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()`](https://python-all.ru/3.16/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream.expandNode) и переключиться на обработку через DOM.

#### `class xml.dom.pulldom.PullDOM(documentFactory=None)`

Подкласс [`xml.sax.handler.ContentHandler`](https://python-all.ru/3.16/library/xml.sax.handler.html#xml.sax.handler.ContentHandler).

#### `class xml.dom.pulldom.SAX2DOM(documentFactory=None)`

Подкласс [`xml.sax.handler.ContentHandler`](https://python-all.ru/3.16/library/xml.sax.handler.html#xml.sax.handler.ContentHandler).

#### `xml.dom.pulldom.parse(stream_or_string, parser=None, bufsize=None)`

Возвращает [`DOMEventStream`](https://python-all.ru/3.16/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream) из переданных входных данных. *stream\_or\_string* может быть именем файла или файлоподобным объектом. *parser*, если задан, должен быть объектом [`XMLReader`](https://python-all.ru/3.16/library/xml.sax.reader.html#xml.sax.xmlreader.XMLReader). Эта функция изменит обработчик документа анализатора и активирует поддержку пространств имён; другие настройки анализатора (например, установка разрешителя сущностей) должны быть выполнены заранее.

Если у вас есть XML в строке, можно использовать функцию [`parseString()`](https://python-all.ru/3.16/library/xml.dom.pulldom.html#xml.dom.pulldom.parseString):

#### `xml.dom.pulldom.parseString(string, parser=None)`

Возвращает [`DOMEventStream`](https://python-all.ru/3.16/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream), представляющий (Unicode-)строку *string*.

#### `xml.dom.pulldom.default_bufsize`

Значение по умолчанию для параметра *bufsize* в [`parse()`](https://python-all.ru/3.16/library/xml.dom.pulldom.html#xml.dom.pulldom.parse).

Значение этой переменной можно изменить до вызова [`parse()`](https://python-all.ru/3.16/library/xml.dom.pulldom.html#xml.dom.pulldom.parse), и новое значение вступит в силу.

## Объекты DOMEventStream

#### `class xml.dom.pulldom.DOMEventStream(stream, parser, bufsize)`

Изменено в версии 3.11: Поддержка метода [`__getitem__()`](https://python-all.ru/3.16/reference/datamodel.html#object.__getitem__) удалена.

#### `getEvent()`

Возвращает кортеж, содержащий *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.16/library/xml.dom.pulldom.html#xml.dom.pulldom.DOMEventStream.expandNode).

#### `expandNode(node)`

Расширяет всех потомков *node* в *node*. Пример:

```python
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':
        # Следующий оператор выводит только '<p/>'
        print(node.toxml())
        doc.expandNode(node)
        # Следующий оператор выводит узел со всеми его дочерними элементами '<p>Some text <div>and more</div></p>'
        print(node.toxml())
```

#### `reset()`
