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

---

# 20.5. [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) – API ElementTree XML

Модуль [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) реализует простой и эффективный API для разбора и создания XML-данных.

Изменено в версии 3.3: Этот модуль будет использовать быструю реализацию, когда это возможно. Модуль `xml.etree.cElementTree` устарел.

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

## 20.5.1. Учебное руководство

Это краткое руководство по использованию [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) (сокращённо `ET`). Цель – продемонстрировать некоторые строительные блоки и основные понятия модуля.

### 20.5.1.1. XML-дерево и элементы

XML по своей природе иерархический формат данных, и самый естественный способ его представления – дерево. `ET` предоставляет для этого два класса: [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) представляет весь XML-документ как дерево, а [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) представляет отдельный узел в этом дереве. Взаимодействие со всем документом (чтение и запись в/из файлов) обычно выполняется на уровне [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree). Взаимодействие с отдельным XML-элементом и его дочерними элементами выполняется на уровне [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

### 20.5.1.2. Разбор XML

В этом разделе в качестве примера будет использоваться следующий XML-документ:

```xml
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
```

Данные можно импортировать, прочитав файл:

```python
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
```

Или непосредственно из строки:

```python
root = ET.fromstring(country_data_as_string)
```

[`fromstring()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.fromstring) разбирает XML из строки непосредственно в [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), который является корневым элементом разобранного дерева. Другие функции разбора могут создавать [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree). Сверьтесь с документацией, чтобы быть уверенным.

Будучи [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), `root` имеет тег и словарь атрибутов:

```python
>>> root.tag
'data'
>>> root.attrib
{}
```

У него также есть дочерние узлы, которые можно перебирать:

```python
>>> for child in root:
...   print(child.tag, child.attrib)
...
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}
```

Дочерние узлы вложены, и к конкретным дочерним узлам можно обратиться по индексу:

```python
>>> root[0][1].text
'2008'
```

> **Примечание**
>
> Не все элементы XML-входа станут элементами разобранного дерева. В настоящее время этот модуль пропускает XML-комментарии, инструкции обработки и объявления типа документа во входных данных. Тем не менее, деревья, построенные с помощью API этого модуля, а не путём разбора XML-текста, могут содержать комментарии и инструкции обработки; они будут включены при генерации XML-вывода. К объявлению типа документа можно получить доступ, передав пользовательский экземпляр [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) конструктору [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser).

### 20.5.1.3. Pull API для неблокирующего разбора

Большинство функций разбора, предоставляемых этим модулем, требуют чтения всего документа целиком перед возвратом какого-либо результата. Можно использовать [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) и передавать в него данные по частям, но это push-API, которое вызывает методы на цель-колбэк, что слишком низкоуровнево и неудобно для большинства задач. Иногда пользователь действительно хочет иметь возможность разбирать XML инкрементально, без блокирующих операций, наслаждаясь удобством полностью сконструированных объектов [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

Наиболее мощный инструмент для этого – [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser). Он не требует блокирующего чтения для получения XML-данных, а вместо этого получает данные инкрементально через вызовы [`XMLPullParser.feed()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.feed). Чтобы получить разобранные XML-элементы, вызовите [`XMLPullParser.read_events()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events). Вот пример:

```python
>>> parser = ET.XMLPullParser(['start', 'end'])
>>> parser.feed('<mytag>sometext')
>>> list(parser.read_events())
[('start', <Element 'mytag' at 0x7fa66db2be58>)]
>>> parser.feed(' more text</mytag>')
>>> for event, elem in parser.read_events():
...   print(event)
...   print(elem.tag, 'text=', elem.text)
...
end
```

Очевидный вариант использования – приложения, работающие в неблокирующем режиме, где XML-данные поступают из сокета или читаются постепенно с какого-либо устройства хранения. В таких случаях блокирующие чтения неприемлемы.

Из-за своей гибкости [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) может быть неудобен для более простых сценариев использования. Если вы не против блокировки приложения при чтении XML-данных, но всё же хотите иметь возможность инкрементального разбора, обратите внимание на [`iterparse()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse). Он может быть полезен при чтении большого XML-документа, который не хочется полностью хранить в памяти.

### 20.5.1.4. Поиск интересующих элементов

[`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) имеет несколько полезных методов, которые помогают рекурсивно перебирать всё поддерево ниже него (его дочерние элементы, их дочерние и т.д.). Например, [`Element.iter()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iter):

```python
>>> for neighbor in root.iter('neighbor'):
...   print(neighbor.attrib)
...
{'name': 'Austria', 'direction': 'E'}
{'name': 'Switzerland', 'direction': 'W'}
{'name': 'Malaysia', 'direction': 'N'}
{'name': 'Costa Rica', 'direction': 'W'}
{'name': 'Colombia', 'direction': 'E'}
```

[`Element.findall()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall) находит только элементы с тегом, которые являются прямыми дочерними элементами текущего элемента. [`Element.find()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find) находит *первый* дочерний элемент с определённым тегом, а [`Element.text`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.text) даёт доступ к текстовому содержимому элемента. [`Element.get()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.get) даёт доступ к атрибутам элемента:

```python
>>> for country in root.findall('country'):
...   rank = country.find('rank').text
...   name = country.get('name')
...   print(name, rank)
...
Liechtenstein 1
Singapore 4
Panama 68
```

Более сложное задание критериев поиска элементов возможно с помощью [*XPath*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath).

### 20.5.1.5. Изменение XML-файла

[`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) предоставляет простой способ построения XML-документов и записи их в файлы. Метод [`ElementTree.write()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write) служит этой цели.

После создания объект [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) можно изменять, напрямую меняя его поля (например, [`Element.text`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.text)), добавляя и изменяя атрибуты (метод [`Element.set()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.set)), а также добавляя новые дочерние элементы (например, с помощью [`Element.append()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.append)).

Допустим, мы хотим увеличить на единицу ранг каждой страны и добавить атрибут `updated` элементу rank:

```python
>>> for rank in root.iter('rank'):
...   new_rank = int(rank.text) + 1
...   rank.text = str(new_rank)
...   rank.set('updated', 'yes')
...
>>> tree.write('output.xml')
```

Теперь наш XML выглядит так:

```xml
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>
```

Элементы можно удалять с помощью [`Element.remove()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.remove). Допустим, мы хотим удалить все страны с рангом выше 50:

```python
>>> for country in root.findall('country'):
...   rank = int(country.find('rank').text)
...   if rank > 50:
...     root.remove(country)
...
>>> tree.write('output.xml')
```

Теперь наш XML выглядит так:

```xml
<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
</data>
```

### 20.5.1.6. Построение XML-документов

Функция [`SubElement()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement) также предоставляет удобный способ создания новых дочерних элементов для заданного элемента:

```python
>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(c, 'd')
>>> ET.dump(a)
<a><b /><c><d /></c></a>
```

### 20.5.1.7. Разбор XML с пространствами имён

Если XML-вход содержит [пространства имён](https://python-all.ru/3.4/library/xml.etree.elementtree.html), теги и атрибуты с префиксами вида `prefix:sometag` расширяются до `{uri}sometag`, где *префикс* заменяется на полный *URI*. Кроме того, если есть [пространство имён по умолчанию](https://python-all.ru/3.4/library/xml.etree.elementtree.html), полный URI добавляется ко всем тегам без префикса.

Вот пример XML, в котором используются два пространства имён: одно с префиксом «fictional», а другое выступает в качестве пространства имён по умолчанию:

```xml
<?xml version="1.0"?>
<actors xmlns:fictional="http://characters.example.com"
        xmlns="http://people.example.com">
    <actor>
        <name>John Cleese</name>
        <fictional:character>Lancelot</fictional:character>
        <fictional:character>Archie Leach</fictional:character>
    </actor>
    <actor>
        <name>Eric Idle</name>
        <fictional:character>Sir Robin</fictional:character>
        <fictional:character>Gunther</fictional:character>
        <fictional:character>Commander Clement</fictional:character>
    </actor>
</actors>
```

Один из способов поиска и изучения этого XML-примера – вручную добавить URI к каждому тегу или атрибуту в xpath [`find()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find) или [`findall()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall):

```python
root = fromstring(xml_text)
for actor in root.findall('{http://people.example.com}actor'):
    name = actor.find('{http://people.example.com}name')
    print(name.text)
    for char in actor.findall('{http://characters.example.com}character'):
        print(' |-->', char.text)
```

Более удобный способ поиска в XML с пространствами имён – создать словарь с собственными префиксами и использовать их в функциях поиска:

```python
ns = {'real_person': 'http://people.example.com',
      'role': 'http://characters.example.com'}

for actor in root.findall('real_person:actor', ns):
    name = actor.find('real_person:name', ns)
    print(name.text)
    for char in actor.findall('role:character', ns):
        print(' |-->', char.text)
```

Оба подхода выводят одно и то же:

```python
John Cleese
 |--> Lancelot
 |--> Archie Leach
Eric Idle
 |--> Sir Robin
 |--> Gunther
 |--> Commander Clement
```

### 20.5.1.8. Дополнительные ресурсы

Смотрите [http://effbot.org/zone/element-index.htm](https://python-all.ru/3.4/library/xml.etree.elementtree.html) для обучающих материалов и ссылок на другую документацию.

## 20.5.2. Поддержка XPath

Этот модуль предоставляет ограниченную поддержку [XPath-выражений](https://python-all.ru/3.4/library/xml.etree.elementtree.html) для поиска элементов в дереве. Цель – поддержать небольшое подмножество сокращённого синтаксиса; полноценный движок XPath выходит за рамки модуля.

### 20.5.2.1. Пример

Вот пример, демонстрирующий некоторые возможности XPath модуля. Мы будем использовать XML-документ `countrydata` из раздела [*Разбор XML*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-parsing-xml):

```python
import xml.etree.ElementTree as ET

root = ET.fromstring(countrydata)

# Элементы верхнего уровня
root.findall(".")

# Все элементы 'neighbor', являющиеся внуками дочерних элементов 'country' верхнего уровня
# элементы
root.findall("./country/neighbor")

# Узлы с name='Singapore', имеющие дочерний элемент 'year'
root.findall(".//year/..[@name='Singapore']")

# Элементы 'year', являющиеся дочерними для узлов с name='Singapore'
root.findall(".//*[@name='Singapore']/year")

# Все элементы 'neighbor', являющиеся вторым дочерним элементом своего родителя
root.findall(".//neighbor[2]")
```

### 20.5.2.2. Поддерживаемый синтаксис XPath

| Синтаксис | Значение |
| --- | --- |
| `тег` | Выбирает все дочерние элементы с заданным тегом. Например, `spam` выбирает все дочерние элементы с именем `spam`, а `spam/egg` выбирает все внучатые элементы с именем `egg` во всех дочерних элементах с именем `spam`. |
| `*` | Выбирает все дочерние элементы. Например, `*/egg` выбирает все внучатые элементы с именем `egg`. |
| `.` | Выбирает текущий узел. Это особенно полезно в начале пути, чтобы указать, что это относительный путь. |
| `//` | Выбирает все подэлементы на всех уровнях ниже текущего элемента. Например, `.//egg` выбирает все элементы `egg` во всём дереве. |
| `..` | Выбирает родительский элемент. Возвращает `None`, если путь пытается достичь предков начального элемента (элемента, для которого была вызвана функция `find`). |
| `[@attrib]` | Выбирает все элементы, у которых есть указанный атрибут. |
| `[@attrib='value']` | Выбирает все элементы, у которых указанный атрибут имеет заданное значение. Значение не может содержать кавычки. |
| `[tag]` | Выбирает все элементы, у которых есть дочерний элемент с именем `тег`. Поддерживаются только непосредственные дочерние элементы. |
| `[tag='text']` | Выбирает все элементы, у которых есть дочерний элемент с именем `tag`, полное текстовое содержимое которого, включая дочерние элементы, равно заданному `text`. |
| `[position]` | Выбирает все элементы, находящиеся на заданной позиции. Позицией может быть целое число (1 – это первая позиция), выражение `last()` (для последней позиции) или позиция относительно последней позиции (например, `last()-1`). |

Предикаты (выражения в квадратных скобках) должны предваряться именем тега, звёздочкой или другим предикатом. Предикаты `position` должны предваряться именем тега.

## 20.5.3. Справочник

### 20.5.3.1. Функции

#### `xml.etree.ElementTree.Comment(text=None)`

Фабрика элементов Comment. Эта фабричная функция создаёт специальный элемент, который будет сериализован как XML-комментарий стандартным сериализатором. Строка комментария может быть как байтовой строкой, так и строкой Unicode. *text* – это строка, содержащая текст комментария. Возвращает экземпляр элемента, представляющий комментарий.

Обратите внимание, что [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) пропускает комментарии во входных данных, вместо того чтобы создавать для них объекты комментариев. [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) будет содержать узлы комментариев, только если они были вставлены в дерево с помощью одного из методов [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

#### `xml.etree.ElementTree.dump(elem)`

Записывает дерево элементов или структуру элементов в sys.stdout. Эту функцию следует использовать только для отладки.

Точный формат вывода зависит от реализации. В этой версии он записывается как обычный XML-файл.

*elem* – это дерево элементов или отдельный элемент.

#### `xml.etree.ElementTree.fromstring(text)`

Разбирает XML-фрагмент из строковой константы. То же, что и [`XML()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XML). *text* – это строка, содержащая XML-данные. Возвращает экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

#### `xml.etree.ElementTree.fromstringlist(sequence, parser=None)`

Разбирает XML-документ из последовательности строковых фрагментов. *sequence* – это список или другая последовательность, содержащая фрагменты XML-данных. *parser* – это необязательный экземпляр анализатора. Если он не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

Новое в версии 3.2.

#### `xml.etree.ElementTree.iselement(element)`

Проверяет, является ли объект корректным элементом. *element* – это экземпляр элемента. Возвращает истинное значение, если это объект элемента.

#### `xml.etree.ElementTree.iterparse(source, events=None, parser=None)`

Разбирает XML-фрагмент в дерево элементов инкрементально и сообщает пользователю о происходящем. *source* – это имя файла или [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object), содержащий XML-данные. *events* – это последовательность событий, о которых нужно сообщать. Поддерживаются строки `"start"`, `"end"`, `"start-ns"` и `"end-ns"` (события «ns» используются для получения подробной информации о пространствах имён). Если *events* опущен, сообщаются только события `"end"`. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). *parser* должен быть подклассом [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) и может использовать только стандартный [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) в качестве цели. Возвращает [*итератор*](https://python-all.ru/3.4/glossary.html#term-iterator), предоставляющий пары `(event, elem)`.

Обратите внимание, что хотя [`iterparse()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) строит дерево инкрементально, он выполняет блокирующие чтения из *source* (или файла, который он называет). Поэтому он не подходит для приложений, где блокирующие чтения недопустимы. Для полностью неблокирующего разбора см. [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser).

> **Примечание**
>
> [`iterparse()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) гарантирует только то, что он увидел символ «\>» начального тега, когда порождает событие «start», поэтому атрибуты определены, но содержимое атрибутов text и tail на этом этапе не определено. То же самое касается дочерних элементов: они могут присутствовать, а могут и нет.
>
> Если нужен полностью заполненный элемент, используйте события "end".

Устарело с версии 3.4: Аргумент *parser*.

#### `xml.etree.ElementTree.parse(source, parser=None)`

Разбирает XML-фрагмент в дерево элементов. *source* – это имя файла или файловый объект, содержащий XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree).

#### `xml.etree.ElementTree.ProcessingInstruction(target, text=None)`

Фабрика PI-элементов. Эта фабричная функция создаёт специальный элемент, который будет сериализован как инструкция обработки XML. *target* – строка, содержащая цель PI. *text* – строка, содержащая содержимое PI, если задано. Возвращает экземпляр элемента, представляющий инструкцию обработки.

Обратите внимание, что [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) пропускает инструкции обработки во входных данных, а не создаёт для них объекты комментариев. [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) будет содержать узлы инструкций обработки, только если они были вставлены в дерево с помощью одного из методов [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

#### `xml.etree.ElementTree.register_namespace(prefix, uri)`

Регистрирует префикс пространства имён. Реестр является глобальным, и любое существующее сопоставление для данного префикса или URI пространства имён будет удалено. *prefix* – префикс пространства имён. *uri* – URI пространства имён. Теги и атрибуты в этом пространстве имён будут сериализованы с указанным префиксом, если это возможно.

Новое в версии 3.2.

#### `xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)`

Фабрика подэлементов. Эта функция создаёт экземпляр элемента и добавляет его к существующему элементу.

Имя элемента, имена атрибутов и значения атрибутов могут быть как байтовыми строками, так и строками Unicode. *parent* – родительский элемент. *tag* – имя подэлемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы. Возвращает экземпляр элемента.

#### `xml.etree.ElementTree.tostring(element, encoding="us-ascii", method="xml", *, short_empty_elements=True)`

Генерирует строковое представление XML-элемента, включая все дочерние элементы. *element* – это экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element). *encoding* [\[1\]](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id5) – это кодировка вывода (по умолчанию US-ASCII). Используйте `encoding="unicode"` для генерации строки Unicode (иначе генерируется байтовая строка). *method* может быть `"xml"`, `"html"` или `"text"` (по умолчанию `"xml"`). *short\_empty\_elements* имеет то же значение, что и в [`ElementTree.write()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write). Возвращает (опционально) закодированную строку, содержащую XML-данные.

Новое в версии 3.4: параметр *short\_empty\_elements*.

#### `xml.etree.ElementTree.tostringlist(element, encoding="us-ascii", method="xml", *, short_empty_elements=True)`

Генерирует строковое представление XML-элемента, включая все дочерние элементы. *element* – это экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element). *encoding* [\[1\]](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id5) – это кодировка вывода (по умолчанию US-ASCII). Используйте `encoding="unicode"` для генерации строки Unicode (иначе генерируется байтовая строка). *method* может быть `"xml"`, `"html"` или `"text"` (по умолчанию `"xml"`). *short\_empty\_elements* имеет то же значение, что и в [`ElementTree.write()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write). Возвращает список (опционально) закодированных строк, содержащих XML-данные. Не гарантируется какой-либо определённый порядок, за исключением того, что `b"".join(tostringlist(element)) == tostring(element)`.

Новое в версии 3.2.

Новое в версии 3.4: параметр *short\_empty\_elements*.

#### `xml.etree.ElementTree.XML(text, parser=None)`

Разбирает XML-фрагмент из строковой константы. Эту функцию можно использовать для встраивания «XML-литералов» в код Python. *text* – это строка, содержащая XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

#### `xml.etree.ElementTree.XMLID(text, parser=None)`

Разбирает XML-фрагмент из строковой константы, а также возвращает словарь, который сопоставляет идентификаторы элементов с элементами. *text* – это строка, содержащая XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает кортеж, содержащий экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) и словарь.

### 20.5.3.2. Объекты Element

#### `class xml.etree.ElementTree.Element(tag, attrib={}, **extra)`

Класс Element. Этот класс определяет интерфейс Element и предоставляет эталонную реализацию этого интерфейса.

Имя элемента, имена атрибутов и значения атрибутов могут быть либо байтовыми строками, либо строками Unicode. *tag* – имя элемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы.

#### `tag`

Строка, определяющая, какие данные представляет этот элемент (иначе говоря, тип элемента).

#### `text`

#### `tail`

Эти атрибуты можно использовать для хранения дополнительных данных, связанных с элементом. Их значениями обычно являются строки, но могут быть и любые другие объекты, зависящие от приложения. Если элемент создан из XML-файла, атрибут *text* содержит либо текст между открывающим тегом элемента и его первым дочерним элементом или закрывающим тегом, либо `None`, а атрибут *tail* содержит либо текст между закрывающим тегом элемента и следующим тегом, либо `None`. Для XML-данных

```xml
<a><b>1<c>2<d/>3</c></b>4</a>
```

элемент *a* имеет `None` для обоих атрибутов *text* и *tail*, элемент *b* имеет *text* `"1"` и *tail* `"4"`, элемент *c* имеет *text* `"2"` и *tail* `None`, а элемент *d* имеет *text* `None` и *tail* `"3"`.

Чтобы собрать внутренний текст элемента, см. [`itertext()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.itertext), например `"".join(element.itertext())`.

Приложения могут хранить в этих атрибутах произвольные объекты.

#### `attrib`

Словарь, содержащий атрибуты элемента. Обратите внимание, что хотя значение *attrib* всегда является настоящим изменяемым словарём Python, реализация ElementTree может использовать другое внутреннее представление и создавать словарь только по запросу. Чтобы воспользоваться преимуществами таких реализаций, по возможности используйте приведённые ниже методы словаря.

Следующие методы, подобные словарным, работают с атрибутами элемента.

#### `clear()`

Сбрасывает элемент. Эта функция удаляет все дочерние элементы, очищает все атрибуты и устанавливает атрибуты text и tail в `None`.

#### `get(key, default=None)`

Возвращает атрибут элемента с именем *key*.

Возвращает значение атрибута или *default*, если атрибут не найден.

#### `items()`

Возвращает атрибуты элемента в виде последовательности пар (имя, значение). Атрибуты возвращаются в произвольном порядке.

#### `keys()`

Возвращает имена атрибутов элемента в виде списка. Имена возвращаются в произвольном порядке.

#### `set(key, value)`

Устанавливает атрибут *key* элемента в *value*.

Следующие методы работают с дочерними элементами (подэлементами) текущего элемента.

#### `append(subelement)`

Добавляет элемент *subelement* в конец внутреннего списка дочерних элементов этого элемента. Возбуждает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), если *subelement* не является [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

#### `extend(subelements)`

Добавляет *subelements* из объекта-последовательности с нулем или более элементов. Возбуждает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), если дочерний элемент не является [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

Новое в версии 3.2.

#### `find(match, namespaces=None)`

Находит первый дочерний элемент, соответствующий *match*. *match* может быть именем тега или [*путем*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает экземпляр элемента или `None`. *namespaces* – необязательное отображение префикса пространства имен на полное имя.

#### `findall(match, namespaces=None)`

Находит все соответствующие подэлементы по имени тега или [*пути*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает список, содержащий все подходящие элементы в порядке документа. *namespaces* – необязательное отображение префикса пространства имён в полное имя.

#### `findtext(match, default=None, namespaces=None)`

Находит текст для первого подэлемента, соответствующего *match*. *match* может быть именем тега или [*путём*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает текстовое содержимое первого подходящего элемента или *default*, если элемент не найден. Обратите внимание: если у подходящего элемента нет текстового содержимого, возвращается пустая строка. *namespaces* – необязательное отображение префикса пространства имён в полное имя.

#### `getchildren()`

Устарело с версии 3.2: Используйте `list(elem)` или итерацию.

#### `getiterator(tag=None)`

Устарело с версии 3.2: Вместо этого используйте метод [`Element.iter()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iter).

#### `insert(index, subelement)`

Вставляет *subelement* в заданную позицию в этом элементе. Возбуждает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), если *subelement* не является [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

#### `iter(tag=None)`

Создает древесный [*итератор*](https://python-all.ru/3.4/glossary.html#term-iterator) с текущим элементом в качестве корня. Итератор обходит этот элемент и все элементы ниже него в порядке документа (сначала вглубь). Если *tag* не равен `None` или `'*'`, из итератора возвращаются только элементы, чей тег равен *tag*. Если структура дерева изменяется во время итерации, результат не определен.

Новое в версии 3.2.

#### `iterfind(match, namespaces=None)`

Находит все подходящие подэлементы по имени тега или [*path*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает итерируемый объект, выдающий все подходящие элементы в порядке документа. *namespaces* – необязательное отображение префикса пространства имён на полное имя.

Новое в версии 3.2.

#### `itertext()`

Создаёт текстовый итератор. Итератор перебирает этот элемент и все подэлементы в порядке документа и возвращает весь внутренний текст.

Новое в версии 3.2.

#### `makeelement(tag, attrib)`

Создает новый объект элемента того же типа, что и этот элемент. Не вызывайте этот метод, вместо этого используйте фабричную функцию [`SubElement()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement).

#### `remove(subelement)`

Удаляет *subelement* из элемента. В отличие от методов find\*, этот метод сравнивает элементы по идентичности экземпляра, а не по значению тега или содержимому.

[`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) объекты также поддерживают следующие методы последовательностного типа для работы с подэлементами: [`__delitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__delitem__), [`__getitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getitem__), [`__setitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__setitem__), [`__len__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__len__).

Внимание: элементы без подэлементов будут иметь значение `False` при проверке. Это поведение изменится в будущих версиях. Вместо этого используйте проверку `len(elem)` или `elem is None`.

```python
element = root.find('foo')

if not element:  # осторожно!
    print("element not found, or element has no subelements")

if element is None:
    print("element not found")
```

### 20.5.3.3. Объекты ElementTree

#### `class xml.etree.ElementTree.ElementTree(element=None, file=None)`

Класс-обёртка ElementTree. Этот класс представляет целую иерархию элементов и добавляет дополнительную поддержку сериализации в стандартный XML и из него.

*element* – корневой элемент. Дерево инициализируется содержимым XML-*файла*, если он указан.

#### `_setroot(element)`

Заменяет корневой элемент этого дерева. При этом текущее содержимое дерева отбрасывается и заменяется указанным элементом. Используйте с осторожностью. *element* – экземпляр элемента.

#### `find(match, namespaces=None)`

То же, что и [`Element.find()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find), начиная с корня дерева.

#### `findall(match, namespaces=None)`

То же, что и [`Element.findall()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall), начиная с корня дерева.

#### `findtext(match, default=None, namespaces=None)`

То же, что и [`Element.findtext()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findtext), начиная с корня дерева.

#### `getiterator(tag=None)`

Устарело с версии 3.2: Вместо этого используйте метод [`ElementTree.iter()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.iter).

#### `getroot()`

Возвращает корневой элемент этого дерева.

#### `iter(tag=None)`

Создаёт и возвращает итератор дерева для корневого элемента. Итератор обходит все элементы этого дерева в порядке следования разделов. *tag* – это тег, который нужно искать (по умолчанию возвращаются все элементы).

#### `iterfind(match, namespaces=None)`

То же, что и [`Element.iterfind()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iterfind), начиная с корня дерева.

Новое в версии 3.2.

#### `parse(source, parser=None)`

Загружает внешний XML-раздел в это дерево элементов. *source* – это имя файла или [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object). *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает корневой элемент раздела.

#### `write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml", *, short_empty_elements=True)`

Записывает дерево элементов в файл в формате XML. *file* – это имя файла или [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object), открытый для записи. *encoding* [\[1\]](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id5) – это кодировка вывода (по умолчанию US-ASCII). *xml\_declaration* управляет добавлением XML-объявления в файл. Используйте `False` для отключения, `True` для всегда, `None` для добавления только если не US-ASCII, UTF-8 или Unicode (по умолчанию `None`). *default\_namespace* задаёт пространство имён XML по умолчанию (для “xmlns”). *method* может быть `"xml"`, `"html"` или `"text"` (по умолчанию `"xml"`). Параметр *short\_empty\_elements* (только ключевой аргумент) управляет форматированием элементов без содержимого. Если *True* (по умолчанию), они выводятся как один самозакрывающийся тег, иначе – как пара открывающего и закрывающего тегов.

Результат может быть строкой ([`str`](https://python-all.ru/3.4/library/stdtypes.html#str)) или двоичными данными ([`bytes`](https://python-all.ru/3.4/library/functions.html#bytes)). Это управляется аргументом *encoding*. Если *encoding* равно `"unicode"`, результат – строка; в противном случае – двоичные данные. Обратите внимание, что это может конфликтовать с типом *file*, если это открытый [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object); убедитесь, что не пытаетесь записать строку в двоичный поток и наоборот.

Новое в версии 3.4: параметр *short\_empty\_elements*.

Это XML-файл, который будет обрабатываться:

```python
<html>
    <head>
        <title>Example page</title>
    </head>
    <body>
        <p>Moved to <a href="http://example.org/">example.org</a>
        or <a href="http://example.com/">example.com</a>.</p>
    </body>
</html>
```

Пример изменения атрибута «target» каждой ссылки в первом абзаце:

```python
>>> from xml.etree.ElementTree import ElementTree
>>> tree = ElementTree()
>>> tree.parse("index.xhtml")
<Element 'html' at 0xb77e6fac>
>>> p = tree.find("body/p")     # Находит первое вхождение тега p в body
>>> p
<Element 'p' at 0xb77ec26c>
>>> links = list(p.iter("a"))   # Возвращает список всех ссылок
>>> links
[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]
>>> for i in links:             # Перебирает все найденные ссылки
...     i.attrib["target"] = "blank"
>>> tree.write("output.xhtml")
```

### 20.5.3.4. Объекты QName

#### `class xml.etree.ElementTree.QName(text_or_uri, tag=None)`

Обёртка QName. Её можно использовать для обёртки значения атрибута QName, чтобы обеспечить правильную обработку пространств имён при выводе. *text\_or\_uri* – это строка, содержащая значение QName в формате {uri}local, или, если задан аргумент tag, часть URI QName. Если *tag* задан, первый аргумент интерпретируется как URI, а этот аргумент – как локальное имя. Экземпляры [`QName`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.QName) непрозрачны.

### 20.5.3.5. Объекты TreeBuilder

#### `class xml.etree.ElementTree.TreeBuilder(element_factory=None)`

Универсальный построитель структуры элементов. Этот построитель преобразует последовательность вызовов методов start, data и end в правильно сформированную структуру элементов. Этот класс можно использовать для построения структуры элементов с помощью пользовательского анализатора XML или анализатора для другого XML-подобного формата. *element\_factory*, если задан, должен быть вызываемым объектом, принимающим два позиционных аргумента: тег и словарь атрибутов. Ожидается, что он возвращает новый экземпляр элемента.

#### `close()`

Сбрасывает буферы построителя и возвращает корневой элемент документа. Возвращает экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

#### `data(data)`

Добавляет текст в текущий элемент. *data* является строкой. Это должна быть либо байтовая строка, либо строка Unicode.

#### `end(tag)`

Закрывает текущий элемент. *tag* – имя элемента. Возвращает закрытый элемент.

#### `start(tag, attrs)`

Открывает новый элемент. *tag* – имя элемента. *attrs* – словарь, содержащий атрибуты элемента. Возвращает открытый элемент.

Кроме того, пользовательский объект [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) может предоставлять следующий метод:

#### `doctype(name, pubid, system)`

Обрабатывает объявление типа документа. *name* – это имя типа документа. *pubid* – публичный идентификатор. *system* – системный идентификатор. Этот метод не существует в классе [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) по умолчанию.

Новое в версии 3.2.

### 20.5.3.6. Объекты XMLParser

#### `class xml.etree.ElementTree.XMLParser(html=0, target=None, encoding=None)`

Этот класс является низкоуровневым строительным блоком модуля. Он использует [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) для эффективного, событийно-ориентированного разбора XML. Данные XML можно передавать ему по частям с помощью метода [`feed()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.feed), и события разбора преобразуются в push-интерфейс (API) – вызовом колбэков на объекте *target*. Если *target* опущен, используется стандартный [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder). Аргумент *html* исторически использовался для обратной совместимости и теперь устарел. Если передан *encoding* [\[1\]](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id5), его значение переопределяет кодировку, указанную в XML-файле.

Устарело с версии 3.4: Аргумент *html*. Остальные аргументы следует передавать по имени, чтобы подготовиться к удалению аргумента *html*.

#### `close()`

Завершает передачу данных анализатору. Возвращает результат вызова метода `close()` объекта *target*, переданного при создании; по умолчанию это корневой элемент документа.

#### `doctype(name, pubid, system)`

Устарело с версии 3.2: Определите метод [`TreeBuilder.doctype()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.doctype) в собственном целевом объекте TreeBuilder.

#### `feed(data)`

Передает данные парсеру. *data* – это закодированные данные.

[`XMLParser.feed()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.feed) вызывает метод `start(tag, attrs_dict)` объекта *target* для каждого открывающего тега, его метод `end(tag)` – для каждого закрывающего тега, а данные обрабатываются методом `data(data)`. [`XMLParser.close()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.close) вызывает метод `close()` объекта *target*. [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) можно использовать не только для построения древовидной структуры. Ниже приведен пример подсчета максимальной глубины XML-файла:

```python
>>> from xml.etree.ElementTree import XMLParser
>>> class MaxDepth:                     # Целевой объект парсера
...     maxDepth = 0
...     depth = 0
...     def start(self, tag, attrib):   # Вызывается для каждого открывающего тега.
...         self.depth += 1
...         if self.depth > self.maxDepth:
...             self.maxDepth = self.depth
...     def end(self, tag):             # Вызывается для каждого закрывающего тега.
...         self.depth -= 1
...     def data(self, data):
...         pass            # С данными ничего делать не нужно.
...     def close(self):    # Вызывается, когда все данные проанализированы.
...         return self.maxDepth
...
>>> target = MaxDepth()
>>> parser = XMLParser(target=target)
>>> exampleXml = """
... <a>
...   <b>
...   </b>
...   <b>
...     <c>
...       <d>
...       </d>
...     </c>
...   </b>
... </a>"""
>>> parser.feed(exampleXml)
>>> parser.close()
4
```

### 20.5.3.7. Объекты XMLPullParser

#### `class xml.etree.ElementTree.XMLPullParser(events=None)`

Pull-анализатор, подходящий для неблокирующих приложений. Его входной API похож на API [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser), но вместо вызова колбэков на целевой объект, [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) собирает внутренний список событий разбора и позволяет читать из него. *events* – это последовательность событий, которые нужно возвращать. Поддерживаемые события – строки `"start"`, `"end"`, `"start-ns"` и `"end-ns"` (события “ns” используются для получения подробной информации о пространствах имён). Если *events* опущен, сообщаются только события `"end"`.

#### `feed(data)`

Передает парсеру данные в виде байтов.

#### `close()`

Сообщает анализатору, что поток данных завершен. В отличие от [`XMLParser.close()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.close), этот метод всегда возвращает [`None`](https://python-all.ru/3.4/library/constants.html#None). Любые события, еще не полученные на момент закрытия анализатора, всё еще можно прочитать с помощью [`read_events()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events).

#### `read_events()`

Возвращает итератор по событиям, которые были обнаружены в данных, переданных анализатору. Итератор выдает пары `(event, elem)`, где *event* – это строка, представляющая тип события (например, `"end"`), а *elem* – это обнаруженный объект [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).

События, полученные при предыдущем вызове [`read_events()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events), не будут выданы снова. События извлекаются из внутренней очереди только тогда, когда они запрашиваются из итератора, поэтому при параллельном чтении несколькими читателями итераторов, полученных из [`read_events()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events), результаты могут быть непредсказуемыми.

> **Примечание**
>
> [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) гарантирует только то, что он увидел символ “\>” открывающего тега к моменту генерации события “start”, поэтому атрибуты уже определены, но содержимое атрибутов text и tail на этот момент не определено. То же самое относится и к дочерним элементам: они могут присутствовать, а могут и нет.
>
> Если нужен полностью заполненный элемент, используйте события "end".

Новое в версии 3.4.

### 20.5.3.8. Исключения

#### `class xml.etree.ElementTree.ParseError`

Ошибка разбора XML, возникающая при сбое разбора в различных методах разбора этого модуля. Строковое представление экземпляра этого исключения будет содержать понятное пользователю сообщение об ошибке. Кроме того, будут доступны следующие атрибуты:

#### `code`

Числовой код ошибки от анализатора expat. См. документацию [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) для получения списка кодов ошибок и их значений.

#### `position`

Кортеж из номеров строки *line* и столбца *column*, указывающий, где произошла ошибка.

Сноски

| \[1\] | *([1](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id1), [2](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id2), [3](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id3), [4](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id4))* Строка кодировки, включённая в вывод XML, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустима, а «UTF8» – нет. См. [http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.4/library/xml.etree.elementtree.html) и [http://www.iana.org/assignments/character-sets/character-sets.xhtml](https://python-all.ru/3.4/library/xml.etree.elementtree.html). |
| --- | --- |
