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

---

# 20.8. [`xml.dom.pulldom`](https://python-all.ru/3.4/library/xml.dom.pulldom.html#module-xml.dom.pulldom) – Поддержка построения частичных DOM-деревьев

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

---

Модуль [`xml.dom.pulldom`](https://python-all.ru/3.4/library/xml.dom.pulldom.html#module-xml.dom.pulldom) предоставляет «pull-парсер», который также может, при необходимости, создавать фрагменты документа, доступные через DOM. Основная идея заключается в извлечении «событий» из потока входящего XML и их обработке. В отличие от SAX, который также использует событийно-ориентированную модель обработки с колбэками, пользователь pull-парсера отвечает за явное извлечение событий из потока и выполнение цикла по этим событиям до завершения обработки или возникновения ошибки.

> **Предупреждение**
>
> Модуль [`xml.dom.pulldom`](https://python-all.ru/3.4/library/xml.dom.pulldom.html#module-xml.dom.pulldom) не является безопасным для обработки вредоносных данных. Если необходимо разобрать непроверенные или неаутентифицированные данные, см. [*XML-уязвимости*](https://python-all.ru/3.4/library/xml.html#xml-vulnerabilities).

Пример:

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

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

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

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

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

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

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

## 20.8.1. Объекты DOMEventStream

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

#### `getEvent()`

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

#### `expandNode(node)`

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

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

#### `reset()`
