Документация Python неофициальный перевод

xml.etree.elementtree.md

413 строк · 36.6 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/xml.etree.elementtree.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.6. [`xml.etree.ElementTree`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) – API ElementTree XML89**Исходный код:** [Lib/xml/etree/ElementTree.py](https://python-all.ru/src/3.2/Lib/xml/etree/ElementTree.py)1011---1213Тип [`Element`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) – это гибкий контейнер, предназначенный для хранения иерархических структур данных в памяти. Этот тип можно описать как нечто среднее между списком и словарём.1415> **Предупреждение**16>17> Модуль [`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).1819У каждого элемента есть несколько связанных с ним свойств:2021- тег – строка, определяющая, какие данные представляет этот элемент (то есть тип элемента).22- набор атрибутов, хранящихся в словаре Python.23- текстовая строка.24- необязательная строка tail.25- набор дочерних элементов, хранящихся в последовательности Python.2627Для создания экземпляра элемента используйте конструктор [`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).2829Класс [`ElementTree`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) используется для обёртки структуры элементов и преобразования её из XML и в XML.3031Реализация этого API на C доступна как `xml.etree.cElementTree`.3233Смотрите [http://effbot.org/zone/element-index.htm](https://python-all.ru/3.2/library/xml.etree.elementtree.html) для учебных материалов и ссылок на другую документацию. На странице Фредрика Лундха также находится разрабатываемая версия xml.etree.ElementTree.3435Изменено в версии 3.2: API ElementTree обновлён до версии 1.3. Подробнее см. [Introducing ElementTree 1.3](https://python-all.ru/3.2/library/xml.etree.elementtree.html).3637## 19.6.1. Функции3839#### `xml.etree.ElementTree.Comment(text=None)`4041Фабрика элементов Comment. Эта фабричная функция создаёт специальный элемент, который будет сериализован как XML-комментарий стандартным сериализатором. Строка комментария может быть как байтовой строкой, так и строкой Unicode. *text* – это строка, содержащая текст комментария. Возвращает экземпляр элемента, представляющий комментарий.4243#### `xml.etree.ElementTree.dump(elem)`4445Записывает дерево элементов или структуру элементов в sys.stdout. Эту функцию следует использовать только для отладки.4647Точный формат вывода зависит от реализации. В этой версии он записывается как обычный XML-файл.4849*elem* – это дерево элементов или отдельный элемент.5051#### `xml.etree.ElementTree.fromstring(text)`5253Разбирает 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).5455#### `xml.etree.ElementTree.fromstringlist(sequence, parser=None)`5657Разбирает 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).5859Новое в версии 3.2.6061#### `xml.etree.ElementTree.iselement(element)`6263Проверяет, является ли объект корректным элементом. *element* – это экземпляр элемента. Возвращает истинное значение, если это объект элемента.6465#### `xml.etree.ElementTree.iterparse(source, events=None, parser=None)`6667Разбирает 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)`.6869> **Примечание**70>71> [`iterparse()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) гарантирует только то, что при генерации события «start» он уже увидел символ «\>» открывающего тега; поэтому атрибуты определены, но содержимое атрибутов text и tail на этот момент не определено. То же самое относится к дочерним элементам: они могут присутствовать или отсутствовать.72>73> Если нужен полностью заполненный элемент, используйте события "end".7475#### `xml.etree.ElementTree.parse(source, parser=None)`7677Разбирает 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).7879#### `xml.etree.ElementTree.ProcessingInstruction(target, text=None)`8081Фабрика PI-элементов. Эта фабричная функция создаёт специальный элемент, который будет сериализован как инструкция обработки XML. *target* – строка, содержащая цель PI. *text* – строка, содержащая содержимое PI, если задано. Возвращает экземпляр элемента, представляющий инструкцию обработки.8283#### `xml.etree.ElementTree.register_namespace(prefix, uri)`8485Регистрирует префикс пространства имён. Реестр является глобальным, и любое существующее сопоставление для данного префикса или URI пространства имён будет удалено. *prefix* – префикс пространства имён. *uri* – URI пространства имён. Теги и атрибуты в этом пространстве имён будут сериализованы с указанным префиксом, если это возможно.8687Новое в версии 3.2.8889#### `xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)`9091Фабрика подэлементов. Эта функция создаёт экземпляр элемента и добавляет его к существующему элементу.9293Имя элемента, имена атрибутов и значения атрибутов могут быть как байтовыми строками, так и строками Unicode. *parent* – родительский элемент. *tag* – имя подэлемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы. Возвращает экземпляр элемента.9495#### `xml.etree.ElementTree.tostring(element, encoding="us-ascii", method="xml")`9697Генерирует строковое представление 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-данные.9899#### `xml.etree.ElementTree.tostringlist(element, encoding="us-ascii", method="xml")`100101Генерирует строковое представление 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)`.102103Новое в версии 3.2.104105#### `xml.etree.ElementTree.XML(text, parser=None)`106107Разбирает 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).108109#### `xml.etree.ElementTree.XMLID(text, parser=None)`110111Разбирает 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) и словарь.112113## 19.6.2. Объекты Element114115#### `class xml.etree.ElementTree.Element(tag, attrib={}, **extra)`116117Класс Element. Этот класс определяет интерфейс Element и предоставляет эталонную реализацию этого интерфейса.118119Имя элемента, имена атрибутов и значения атрибутов могут быть либо байтовыми строками, либо строками Unicode. *tag* – имя элемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы.120121#### `tag`122123Строка, определяющая, какие данные представляет этот элемент (иначе говоря, тип элемента).124125#### `text`126127Атрибут *text* можно использовать для хранения дополнительных данных, связанных с элементом. Как следует из названия, этот атрибут обычно является строкой, но может быть любым объектом, зависящим от приложения. Если элемент создаётся из XML-файла, атрибут будет содержать любой текст, найденный между тегами элемента.128129#### `tail`130131Атрибут *tail* можно использовать для хранения дополнительных данных, связанных с элементом. Обычно этот атрибут является строкой, но может быть любым объектом, зависящим от приложения. Если элемент создан из XML-файла, атрибут будет содержать любой текст, найденный после закрывающего тега элемента и до следующего тега.132133#### `attrib`134135Словарь, содержащий атрибуты элемента. Обратите внимание, что хотя значение *attrib* всегда является настоящим изменяемым словарём Python, реализация ElementTree может использовать другое внутреннее представление и создавать словарь только по запросу. Чтобы воспользоваться преимуществами таких реализаций, по возможности используйте приведённые ниже методы словаря.136137Следующие методы, подобные словарным, работают с атрибутами элемента.138139#### `clear()`140141Сбрасывает элемент. Эта функция удаляет все подэлементы, очищает все атрибуты и устанавливает атрибуты text и tail в None.142143#### `get(key, default=None)`144145Возвращает атрибут элемента с именем *key*.146147Возвращает значение атрибута или *default*, если атрибут не найден.148149#### `items()`150151Возвращает атрибуты элемента в виде последовательности пар (имя, значение). Атрибуты возвращаются в произвольном порядке.152153#### `keys()`154155Возвращает имена атрибутов элемента в виде списка. Имена возвращаются в произвольном порядке.156157#### `set(key, value)`158159Устанавливает атрибут *key* элемента в *value*.160161Следующие методы работают с дочерними элементами (подэлементами) текущего элемента.162163#### `append(subelement)`164165Добавляет элемент *subelement* в конец внутреннего списка подэлементов данного элемента.166167#### `extend(subelements)`168169Добавляет *subelements* из объекта-последовательности, содержащего ноль или более элементов. Возникает исключение [`AssertionError`](https://python-all.ru/3.2/library/exceptions.html#AssertionError), если подэлемент не является допустимым объектом.170171Новое в версии 3.2.172173#### `find(match)`174175Находит первый подэлемент, соответствующий *match*. *match* может быть именем тега или путём. Возвращает экземпляр элемента или `None`.176177#### `findall(match)`178179Находит все подэлементы, соответствующие имени тега или пути. Возвращает список, содержащий все соответствующие элементы в порядке документа.180181#### `findtext(match, default=None)`182183Находит текст для первого подэлемента, соответствующего *match*. *match* может быть именем тега или путём. Возвращает текстовое содержимое первого соответствующего элемента или *default*, если элемент не найден. Обратите внимание, что если соответствующий элемент не имеет текстового содержимого, возвращается пустая строка.184185#### `getchildren()`186187Устарело с версии 3.2: Используйте `list(elem)` или итерацию.188189#### `getiterator(tag=None)`190191Устарело с версии 3.2: Вместо этого используйте метод [`Element.iter()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iter).192193#### `insert(index, element)`194195Вставляет подэлемент в заданную позицию в данном элементе.196197#### `iter(tag=None)`198199Создает древесный [*итератор*](https://python-all.ru/3.2/glossary.html#term-iterator) с текущим элементом в качестве корня. Итератор обходит этот элемент и все элементы ниже него в порядке документа (сначала вглубь). Если *tag* не равен `None` или `'*'`, из итератора возвращаются только элементы, чей тег равен *tag*. Если структура дерева изменяется во время итерации, результат не определен.200201Новое в версии 3.2.202203#### `iterfind(match)`204205Находит все подэлементы, соответствующие имени тега или пути. Возвращает итерируемый объект, порождающий все соответствующие элементы в порядке документа.206207Новое в версии 3.2.208209#### `itertext()`210211Создаёт текстовый итератор. Итератор перебирает этот элемент и все подэлементы в порядке документа и возвращает весь внутренний текст.212213Новое в версии 3.2.214215#### `makeelement(tag, attrib)`216217Создает новый объект элемента того же типа, что и этот элемент. Не вызывайте этот метод, вместо этого используйте фабричную функцию [`SubElement()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement).218219#### `remove(subelement)`220221Удаляет *subelement* из элемента. В отличие от методов find\*, этот метод сравнивает элементы по идентичности экземпляра, а не по значению тега или содержимому.222223[`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__).224225Внимание: элементы без подэлементов будут иметь значение `False` при проверке. Это поведение изменится в будущих версиях. Вместо этого используйте проверку `len(elem)` или `elem is None`.226227```python228element = root.find('foo')229230if not element:  # осторожно!231    print("element not found, or element has no subelements")232233if element is None:234    print("element not found")235```236237## 19.6.3. Объекты ElementTree238239#### `class xml.etree.ElementTree.ElementTree(element=None, file=None)`240241Класс-обёртка ElementTree. Этот класс представляет целую иерархию элементов и добавляет дополнительную поддержку сериализации в стандартный XML и из него.242243*element* – корневой элемент. Дерево инициализируется содержимым XML-*файла*, если он указан.244245#### `_setroot(element)`246247Заменяет корневой элемент этого дерева. При этом текущее содержимое дерева отбрасывается и заменяется указанным элементом. Используйте с осторожностью. *element* – экземпляр элемента.248249#### `find(match)`250251То же, что и [`Element.find()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find), начиная с корня дерева.252253#### `findall(match)`254255То же, что и [`Element.findall()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall), начиная с корня дерева.256257#### `findtext(match, default=None)`258259То же, что и [`Element.findtext()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findtext), начиная с корня дерева.260261#### `getiterator(tag=None)`262263Устарело с версии 3.2: Вместо этого используйте метод [`ElementTree.iter()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.iter).264265#### `getroot()`266267Возвращает корневой элемент этого дерева.268269#### `iter(tag=None)`270271Создаёт и возвращает итератор дерева для корневого элемента. Итератор перебирает все элементы в этом дереве в порядке следования разделов. *tag* – это тег, который нужно найти (по умолчанию возвращаются все элементы).272273#### `iterfind(match)`274275Находит все подходящие подэлементы по имени тега или пути. То же, что и getroot().iterfind(match). Возвращает итератор, выдающий все подходящие элементы в порядке документа.276277Новое в версии 3.2.278279#### `parse(source, parser=None)`280281Загружает внешний XML-раздел в это дерево элементов. *source* – это имя файла или [*файловый объект*](https://python-all.ru/3.2/glossary.html#term-file-object). *parser* – необязательный экземпляр анализатора. Если не задан, используется стандартный анализатор XMLParser. Возвращает корневой элемент раздела.282283#### `write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml")`284285Записывает дерево элементов в файл в формате 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"`). Возвращает (опционально) закодированную строку.286287Это XML-файл, который будет обрабатываться:288289```python290<html>291    <head>292        <title>Example page</title>293    </head>294    <body>295        <p>Moved to <a href="http://example.org/">example.org</a>296        or <a href="http://example.com/">example.com</a>.</p>297    </body>298</html>299```300301Пример изменения атрибута «target» каждой ссылки в первом абзаце:302303```python304>>> from xml.etree.ElementTree import ElementTree305>>> tree = ElementTree()306>>> tree.parse("index.xhtml")307<Element 'html' at 0xb77e6fac>308>>> p = tree.find("body/p")     # Находит первое вхождение тега p в body309>>> p310<Element 'p' at 0xb77ec26c>311>>> links = list(p.iter("a"))   # Возвращает список всех ссылок312>>> links313[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]314>>> for i in links:             # Перебирает все найденные ссылки315...     i.attrib["target"] = "blank"316>>> tree.write("output.xhtml")317```318319## 19.6.4. Объекты QName320321#### `class xml.etree.ElementTree.QName(text_or_uri, tag=None)`322323Обёртка 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) непрозрачны.324325## 19.6.5. Объекты TreeBuilder326327#### `class xml.etree.ElementTree.TreeBuilder(element_factory=None)`328329Универсальный построитель структуры элементов. Этот построитель преобразует последовательность вызовов методов start, data и end в правильно сформированную структуру элементов. Этот класс можно использовать для построения структуры элементов с помощью пользовательского анализатора XML или анализатора для какого-либо другого XML-подобного формата. *element\_factory* вызывается для создания новых экземпляров [`Element`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), когда он задан.330331#### `close()`332333Сбрасывает буферы построителя и возвращает корневой элемент документа. Возвращает экземпляр [`Element`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).334335#### `data(data)`336337Добавляет текст в текущий элемент. *data* является строкой. Это должна быть либо байтовая строка, либо строка Unicode.338339#### `end(tag)`340341Закрывает текущий элемент. *tag* – имя элемента. Возвращает закрытый элемент.342343#### `start(tag, attrs)`344345Открывает новый элемент. *tag* – имя элемента. *attrs* – словарь, содержащий атрибуты элемента. Возвращает открытый элемент.346347Кроме того, пользовательский объект [`TreeBuilder`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) может предоставлять следующий метод:348349#### `doctype(name, pubid, system)`350351Обрабатывает объявление типа документа. *name* – это имя типа документа. *pubid* – публичный идентификатор. *system* – системный идентификатор. Этот метод не существует в классе [`TreeBuilder`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) по умолчанию.352353Новое в версии 3.2.354355## 19.6.6. Объекты XMLParser356357#### `class xml.etree.ElementTree.XMLParser(html=0, target=None, encoding=None)`358359[`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-файле.360361#### `close()`362363Завершает передачу данных анализатору. Возвращает структуру элемента.364365#### `doctype(name, pubid, system)`366367Устарело с версии 3.2: определите метод [`TreeBuilder.doctype()`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.doctype) для пользовательского TreeBuilder target.368369#### `feed(data)`370371Передает данные парсеру. *data* – это закодированные данные.372373[`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-файла:374375```python376>>> from xml.etree.ElementTree import XMLParser377>>> class MaxDepth:                     # Целевой объект парсера378...     maxDepth = 0379...     depth = 0380...     def start(self, tag, attrib):   # Вызывается для каждого открывающего тега.381...         self.depth += 1382...         if self.depth > self.maxDepth:383...             self.maxDepth = self.depth384...     def end(self, tag):             # Вызывается для каждого закрывающего тега.385...         self.depth -= 1386...     def data(self, data):387...         pass            # С данными ничего делать не нужно.388...     def close(self):    # Вызывается, когда все данные проанализированы.389...         return self.maxDepth390...391>>> target = MaxDepth()392>>> parser = XMLParser(target=target)393>>> exampleXml = """394... <a>395...   <b>396...   </b>397...   <b>398...     <c>399...       <d>400...       </d>401...     </c>402...   </b>403... </a>"""404>>> parser.feed(exampleXml)405>>> parser.close()4064407```408409Сноски410411| \[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). |412| --- | --- |413