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

---

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

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

---

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

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

У каждого элемента есть несколько связанных с ним свойств:

- тег – строка, определяющая, какие данные представляет этот элемент (то есть тип элемента).
- набор атрибутов, хранящихся в словаре Python.
- текстовая строка.
- необязательная строка tail.
- набор дочерних элементов, хранящихся в последовательности Python.

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

Класс [`ElementTree`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) используется для обёртки структуры элементов и преобразования её из XML и в XML.

Реализация этого API на C доступна как `xml.etree.cElementTree`.

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

Изменено в версии 3.2: API ElementTree обновлён до версии 1.3. Подробнее см. [Introducing ElementTree 1.3](https://python-all.ru/3.2/library/xml.etree.elementtree.html).

## 19.6.1. Функции

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

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

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

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

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

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

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

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

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

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

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

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

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

#### `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")`

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

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

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

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

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

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

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

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

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

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

#### `tag`

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

#### `text`

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

#### `tail`

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

#### `attrib`

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

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

#### `clear()`

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

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

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

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

#### `items()`

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

#### `keys()`

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

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

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

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

#### `append(subelement)`

Добавляет элемент *subelement* в конец внутреннего списка подэлементов данного элемента.

#### `extend(subelements)`

Добавляет *subelements* из объекта-последовательности, содержащего ноль или более элементов. Возникает исключение [`AssertionError`](https://python-all.ru/3.2/library/exceptions.html#AssertionError), если подэлемент не является допустимым объектом.

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

#### `find(match)`

Находит первый подэлемент, соответствующий *match*. *match* может быть именем тега или путём. Возвращает экземпляр элемента или `None`.

#### `findall(match)`

Находит все подэлементы, соответствующие имени тега или пути. Возвращает список, содержащий все соответствующие элементы в порядке документа.

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

Находит текст для первого подэлемента, соответствующего *match*. *match* может быть именем тега или путём. Возвращает текстовое содержимое первого соответствующего элемента или *default*, если элемент не найден. Обратите внимание, что если соответствующий элемент не имеет текстового содержимого, возвращается пустая строка.

#### `getchildren()`

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

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

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

#### `insert(index, element)`

Вставляет подэлемент в заданную позицию в данном элементе.

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

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

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

#### `iterfind(match)`

Находит все подэлементы, соответствующие имени тега или пути. Возвращает итерируемый объект, порождающий все соответствующие элементы в порядке документа.

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

#### `itertext()`

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

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

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

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

#### `remove(subelement)`

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

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

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

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

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

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

#### `_setroot(element)`

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

#### `find(match)`

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

#### `findall(match)`

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

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

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

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

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

#### `getroot()`

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

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

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

#### `iterfind(match)`

Находит все подходящие подэлементы по имени тега или пути. То же, что и getroot().iterfind(match). Возвращает итератор, выдающий все подходящие элементы в порядке документа.

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

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

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

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

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

Это 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")
```

## 19.6.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.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.QName) непрозрачны.

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

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

Универсальный построитель структуры элементов. Этот построитель преобразует последовательность вызовов методов start, data и end в правильно сформированную структуру элементов. Этот класс можно использовать для построения структуры элементов с помощью пользовательского анализатора XML или анализатора для какого-либо другого XML-подобного формата. *element\_factory* вызывается для создания новых экземпляров [`Element`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), когда он задан.

#### `close()`

Сбрасывает буферы построителя и возвращает корневой элемент документа. Возвращает экземпляр [`Element`](https://python-all.ru/3.2/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.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) может предоставлять следующий метод:

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

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

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

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

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

[`Element`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) построитель структуры для исходных данных XML, основанный на анализаторе expat. *html* – это предопределённые HTML-сущности. Этот флаг не поддерживается текущей реализацией. *target* – целевой объект. Если опущен, построитель использует экземпляр стандартного класса TreeBuilder. *encoding* [\[1\]](https://python-all.ru/3.2/library/xml.etree.elementtree.html#id5) является необязательным. Если задан, значение переопределяет кодировку, указанную в XML-файле.

#### `close()`

Завершает передачу данных анализатору. Возвращает структуру элемента.

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

Устарело с версии 3.2: определите метод [`TreeBuilder.doctype()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.doctype) для пользовательского TreeBuilder target.

#### `feed(data)`

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

[`XMLParser.feed()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.feed) вызывает метод *target* `start()` для каждого открывающего тега, его метод `end()` для каждого закрывающего тега, а данные обрабатываются методом `data()`. [`XMLParser.close()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.close) вызывает метод *target* `close()`. [`XMLParser`](https://python-all.ru/3.2/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
```

Сноски

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