xml.etree.elementtree.md
1> **Источник:** https://python-all.ru/3.5/library/xml.etree.elementtree.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.5. [`xml.etree.ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) – XML-интерфейс ElementTree89**Исходный код:** [Lib/xml/etree/ElementTree.py](https://python-all.ru/src/3.5/Lib/xml/etree/ElementTree.py)1011---1213Модуль [`xml.etree.ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) реализует простой и эффективный API для разбора и создания XML-данных.1415Изменено в версии 3.3: Этот модуль будет использовать быструю реализацию, когда она доступна. Модуль `xml.etree.cElementTree` устарел.1617> **Предупреждение**18>19> Модуль [`xml.etree.ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) не защищён от вредоносных данных. Если нужно разобрать непроверенные или неаутентифицированные данные, см. [уязвимости XML](https://python-all.ru/3.5/library/xml.html#xml-vulnerabilities).2021## 20.5.1. Учебное руководство2223Это краткое руководство по использованию [`xml.etree.ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) (`ET` в краткой форме). Цель – продемонстрировать некоторые основные компоненты и базовые концепции модуля.2425### 20.5.1.1. XML-дерево и элементы2627XML – это изначально иерархический формат данных, и наиболее естественный способ его представления – дерево. `ET` содержит два класса для этой цели: [`ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) представляет весь XML-документ как дерево, а [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) представляет отдельный узел в этом дереве. Взаимодействие со всем документом (чтение и запись в файлы/из файлов) обычно выполняется на уровне [`ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree). Взаимодействие с отдельным элементом XML и его дочерними элементами выполняется на уровне [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).2829### 20.5.1.2. Разбор XML3031В этом разделе в качестве примера будет использоваться следующий XML-документ:3233```xml34<?xml version="1.0"?>35<data>36 <country name="Liechtenstein">37 <rank>1</rank>38 <year>2008</year>39 <gdppc>141100</gdppc>40 <neighbor name="Austria" direction="E"/>41 <neighbor name="Switzerland" direction="W"/>42 </country>43 <country name="Singapore">44 <rank>4</rank>45 <year>2011</year>46 <gdppc>59900</gdppc>47 <neighbor name="Malaysia" direction="N"/>48 </country>49 <country name="Panama">50 <rank>68</rank>51 <year>2011</year>52 <gdppc>13600</gdppc>53 <neighbor name="Costa Rica" direction="W"/>54 <neighbor name="Colombia" direction="E"/>55 </country>56</data>57```5859Данные можно импортировать, прочитав файл:6061```python62import xml.etree.ElementTree as ET63tree = ET.parse('country_data.xml')64root = tree.getroot()65```6667Или непосредственно из строки:6869```python70root = ET.fromstring(country_data_as_string)71```7273[`fromstring()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.fromstring) разбирает XML из строки непосредственно в [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), который является корневым элементом разобранного дерева. Другие функции разбора могут создавать [`ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree). Для уточнения обратитесь к документации.7475Как [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), `root` имеет тег и словарь атрибутов:7677```python78>>> root.tag79'data'80>>> root.attrib81{}82```8384У него также есть дочерние узлы, которые можно перебирать:8586```python87>>> for child in root:88... print(child.tag, child.attrib)89...90country {'name': 'Liechtenstein'}91country {'name': 'Singapore'}92country {'name': 'Panama'}93```9495Дочерние узлы вложены, и к конкретным дочерним узлам можно обратиться по индексу:9697```python98>>> root[0][1].text99'2008'100```101102> **Примечание**103>104> Не все элементы XML-входных данных станут элементами разобранного дерева. В настоящее время этот модуль пропускает любые XML-комментарии, инструкции по обработке и объявления типа документа во входных данных. Тем не менее, деревья, построенные с помощью API этого модуля, а не путём разбора XML-текста, могут содержать комментарии и инструкции по обработке; они будут включены при генерации XML-вывода. Доступ к объявлению типа документа можно получить, передав пользовательский экземпляр [`TreeBuilder`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) конструктору [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser).105106### 20.5.1.3. Pull API для неблокирующего разбора107108Большинство функций разбора, предоставляемых этим модулем, требуют, чтобы весь документ был прочитан сразу перед возвратом какого-либо результата. Можно использовать [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) и передавать в него данные постепенно, но это push API, который вызывает методы на целевом колбэке, что является слишком низкоуровневым и неудобным для большинства задач. Иногда пользователю действительно нужно иметь возможность разбирать XML постепенно, без блокирующих операций, пользуясь удобством полностью построенных объектов [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).109110Самый мощный инструмент для этого – [`XMLPullParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser). Он не требует блокирующего чтения для получения XML-данных, а вместо этого получает данные постепенно с помощью вызовов [`XMLPullParser.feed()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.feed). Чтобы получить разобранные XML-элементы, вызовите [`XMLPullParser.read_events()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events). Вот пример:111112```python113>>> parser = ET.XMLPullParser(['start', 'end'])114>>> parser.feed('<mytag>sometext')115>>> list(parser.read_events())116[('start', <Element 'mytag' at 0x7fa66db2be58>)]117>>> parser.feed(' more text</mytag>')118>>> for event, elem in parser.read_events():119... print(event)120... print(elem.tag, 'text=', elem.text)121...122end123```124125Очевидный вариант использования – приложения, работающие в неблокирующем режиме, где XML-данные поступают из сокета или читаются постепенно с какого-либо устройства хранения. В таких случаях блокирующие чтения неприемлемы.126127Из-за своей гибкости [`XMLPullParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) может быть неудобен для более простых задач. Если вы не против того, чтобы ваше приложение блокировалось при чтении XML-данных, но всё же хотите иметь возможность инкрементального разбора, обратите внимание на [`iterparse()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse). Он может быть полезен при чтении большого XML-документа, который вы не хотите полностью хранить в памяти.128129### 20.5.1.4. Поиск интересующих элементов130131[`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) имеет несколько полезных методов, которые помогают рекурсивно обходить всё поддерево под ним (его дочерние элементы, их дочерние элементы и так далее). Например, [`Element.iter()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iter):132133```python134>>> for neighbor in root.iter('neighbor'):135... print(neighbor.attrib)136...137{'name': 'Austria', 'direction': 'E'}138{'name': 'Switzerland', 'direction': 'W'}139{'name': 'Malaysia', 'direction': 'N'}140{'name': 'Costa Rica', 'direction': 'W'}141{'name': 'Colombia', 'direction': 'E'}142```143144[`Element.findall()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall) находит только элементы с тегом, которые являются прямыми дочерними элементами текущего элемента. [`Element.find()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find) находит *первый* дочерний элемент с указанным тегом, а [`Element.text`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.text) обращается к текстовому содержимому элемента. [`Element.get()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.get) обращается к атрибутам элемента:145146```python147>>> for country in root.findall('country'):148... rank = country.find('rank').text149... name = country.get('name')150... print(name, rank)151...152Liechtenstein 1153Singapore 4154Panama 68155```156157Более сложное задание критериев поиска элементов возможно с помощью [XPath](https://python-all.ru/3.5/library/xml.etree.elementtree.html#elementtree-xpath).158159### 20.5.1.5. Изменение XML-файла160161[`ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) предоставляет простой способ создания XML-документов и записи их в файлы. Метод [`ElementTree.write()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write) служит этой цели.162163После создания объект [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) можно изменять, напрямую меняя его поля (например, [`Element.text`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.text)), добавляя и изменяя атрибуты (метод [`Element.set()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.set)), а также добавляя новые дочерние элементы (например, с помощью [`Element.append()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.append)).164165Допустим, мы хотим увеличить ранг каждой страны на единицу и добавить атрибут `updated` к элементу ранга:166167```python168>>> for rank in root.iter('rank'):169... new_rank = int(rank.text) + 1170... rank.text = str(new_rank)171... rank.set('updated', 'yes')172...173>>> tree.write('output.xml')174```175176Теперь наш XML выглядит так:177178```xml179<?xml version="1.0"?>180<data>181 <country name="Liechtenstein">182 <rank updated="yes">2</rank>183 <year>2008</year>184 <gdppc>141100</gdppc>185 <neighbor name="Austria" direction="E"/>186 <neighbor name="Switzerland" direction="W"/>187 </country>188 <country name="Singapore">189 <rank updated="yes">5</rank>190 <year>2011</year>191 <gdppc>59900</gdppc>192 <neighbor name="Malaysia" direction="N"/>193 </country>194 <country name="Panama">195 <rank updated="yes">69</rank>196 <year>2011</year>197 <gdppc>13600</gdppc>198 <neighbor name="Costa Rica" direction="W"/>199 <neighbor name="Colombia" direction="E"/>200 </country>201</data>202```203204Элементы можно удалять с помощью [`Element.remove()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.remove). Допустим, мы хотим удалить все страны с рангом выше 50:205206```python207>>> for country in root.findall('country'):208... rank = int(country.find('rank').text)209... if rank > 50:210... root.remove(country)211...212>>> tree.write('output.xml')213```214215Теперь наш XML выглядит так:216217```xml218<?xml version="1.0"?>219<data>220 <country name="Liechtenstein">221 <rank updated="yes">2</rank>222 <year>2008</year>223 <gdppc>141100</gdppc>224 <neighbor name="Austria" direction="E"/>225 <neighbor name="Switzerland" direction="W"/>226 </country>227 <country name="Singapore">228 <rank updated="yes">5</rank>229 <year>2011</year>230 <gdppc>59900</gdppc>231 <neighbor name="Malaysia" direction="N"/>232 </country>233</data>234```235236### 20.5.1.6. Построение XML-документов237238Функция [`SubElement()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement) также предоставляет удобный способ создания новых дочерних элементов для заданного элемента:239240```python241>>> a = ET.Element('a')242>>> b = ET.SubElement(a, 'b')243>>> c = ET.SubElement(a, 'c')244>>> d = ET.SubElement(c, 'd')245>>> ET.dump(a)246<a><b /><c><d /></c></a>247```248249### 20.5.1.7. Разбор XML с пространствами имён250251Если во входном XML есть [пространства имён](https://python-all.ru/3.5/library/xml.etree.elementtree.html), теги и атрибуты с префиксами вида `prefix:sometag` раскрываются до `{uri}sometag`, где *префикс* заменяется полным *URI*. Кроме того, если есть [пространство имён по умолчанию](https://python-all.ru/3.5/library/xml.etree.elementtree.html), то этот полный URI добавляется в начало всех тегов без префикса.252253Вот пример XML, в котором используются два пространства имён: одно с префиксом «fictional», а другое выступает в качестве пространства имён по умолчанию:254255```xml256<?xml version="1.0"?>257<actors xmlns:fictional="http://characters.example.com"258 xmlns="http://people.example.com">259 <actor>260 <name>John Cleese</name>261 <fictional:character>Lancelot</fictional:character>262 <fictional:character>Archie Leach</fictional:character>263 </actor>264 <actor>265 <name>Eric Idle</name>266 <fictional:character>Sir Robin</fictional:character>267 <fictional:character>Gunther</fictional:character>268 <fictional:character>Commander Clement</fictional:character>269 </actor>270</actors>271```272273Один из способов поиска и изучения этого XML-примера – вручную добавить URI к каждому тегу или атрибуту в XPath-выражении [`find()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find) или [`findall()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall):274275```python276root = fromstring(xml_text)277for actor in root.findall('{http://people.example.com}actor'):278 name = actor.find('{http://people.example.com}name')279 print(name.text)280 for char in actor.findall('{http://characters.example.com}character'):281 print(' |-->', char.text)282```283284Более удобный способ поиска в XML с пространствами имён – создать словарь с собственными префиксами и использовать их в функциях поиска:285286```python287ns = {'real_person': 'http://people.example.com',288 'role': 'http://characters.example.com'}289290for actor in root.findall('real_person:actor', ns):291 name = actor.find('real_person:name', ns)292 print(name.text)293 for char in actor.findall('role:character', ns):294 print(' |-->', char.text)295```296297Оба подхода выводят одно и то же:298299```python300John Cleese301 |--> Lancelot302 |--> Archie Leach303Eric Idle304 |--> Sir Robin305 |--> Gunther306 |--> Commander Clement307```308309### 20.5.1.8. Дополнительные ресурсы310311Смотрите [http://effbot.org/zone/element-index.htm](https://python-all.ru/3.5/library/xml.etree.elementtree.html) для обучающих материалов и ссылок на другую документацию.312313## 20.5.2. Поддержка XPath314315Этот модуль предоставляет ограниченную поддержку [XPath-выражений](https://python-all.ru/3.5/library/xml.etree.elementtree.html) для поиска элементов в дереве. Цель – поддержать небольшое подмножество сокращённого синтаксиса; полноценный движок XPath выходит за рамки модуля.316317### 20.5.2.1. Пример318319Вот пример, демонстрирующий некоторые возможности XPath этого модуля. Будем использовать XML-документ `countrydata` из раздела [Разбор XML](https://python-all.ru/3.5/library/xml.etree.elementtree.html#elementtree-parsing-xml):320321```python322import xml.etree.ElementTree as ET323324root = ET.fromstring(countrydata)325326# Элементы верхнего уровня327root.findall(".")328329# Все элементы 'neighbor', являющиеся внуками дочерних элементов 'country' верхнего уровня330# элементы331root.findall("./country/neighbor")332333# Узлы с name='Singapore', имеющие дочерний элемент 'year'334root.findall(".//year/..[@name='Singapore']")335336# Элементы 'year', являющиеся дочерними для узлов с name='Singapore'337root.findall(".//*[@name='Singapore']/year")338339# Все элементы 'neighbor', являющиеся вторым дочерним элементом своего родителя340root.findall(".//neighbor[2]")341```342343### 20.5.2.2. Поддерживаемый синтаксис XPath344345| Синтаксис | Значение |346| --- | --- |347| `tag` | Выбирает все дочерние элементы с указанным тегом. Например, `spam` выбирает все дочерние элементы с именем `spam`, а `spam/egg` выбирает все внучатые элементы с именем `egg` во всех дочерних элементах с именем `spam`. |348| `*` | Выбирает все дочерние элементы. Например, `*/egg` выбирает все внучатые элементы с именем `egg`. |349| `.` | Выбирает текущий узел. Это особенно полезно в начале пути, чтобы указать, что это относительный путь. |350| `//` | Выбирает все вложенные элементы на всех уровнях ниже текущего элемента. Например, `.//egg` выбирает все элементы `egg` во всём дереве. |351| `..` | Выбирает родительский элемент. Возвращает `None`, если путь пытается достичь предков начального элемента (элемента, для которого был вызван `find`). |352| `[@attrib]` | Выбирает все элементы, у которых есть указанный атрибут. |353| `[@attrib='value']` | Выбирает все элементы, у которых указанный атрибут имеет заданное значение. Значение не может содержать кавычки. |354| `[tag]` | Выбирает все элементы, у которых есть дочерний элемент с именем `tag`. Поддерживаются только непосредственные дочерние элементы. |355| `[tag='text']` | Выбирает все элементы, у которых есть дочерний элемент с именем `tag`, чьё полное текстовое содержимое, включая потомков, равно заданному `text`. |356| `[position]` | Выбирает все элементы, расположенные на указанной позиции. Позиция может быть целым числом (1 – первая позиция), выражением `last()` (для последней позиции) или позицией относительно последней позиции (например, `last()-1`). |357358Предикаты (выражения в квадратных скобках) должны предваряться именем тега, звёздочкой или другим предикатом. Предикаты `position` должны предваряться именем тега.359360## 20.5.3. Справочник361362### 20.5.3.1. Функции363364#### `xml.etree.ElementTree.Comment(text=None)`365366Фабрика элементов Comment. Эта фабричная функция создаёт специальный элемент, который будет сериализован как XML-комментарий стандартным сериализатором. Строка комментария может быть как байтовой строкой, так и строкой Unicode. *text* – это строка, содержащая текст комментария. Возвращает экземпляр элемента, представляющий комментарий.367368Обратите внимание, что [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) пропускает комментарии во входных данных, не создавая для них объекты комментариев. [`ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) будет содержать узлы комментариев только в том случае, если они были вставлены в дерево с помощью одного из методов [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).369370#### `xml.etree.ElementTree.dump(elem)`371372Записывает дерево элементов или структуру элементов в sys.stdout. Эту функцию следует использовать только для отладки.373374Точный формат вывода зависит от реализации. В этой версии он записывается как обычный XML-файл.375376*elem* – это дерево элементов или отдельный элемент.377378#### `xml.etree.ElementTree.fromstring(text)`379380Разбирает XML-раздел из строковой константы. То же, что и [`XML()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XML). *text* – это строка, содержащая XML-данные. Возвращает экземпляр [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).381382#### `xml.etree.ElementTree.fromstringlist(sequence, parser=None)`383384Разбирает XML-документ из последовательности строковых фрагментов. *sequence* – это список или другая последовательность, содержащая фрагменты XML-данных. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).385386Новое в версии 3.2.387388#### `xml.etree.ElementTree.iselement(element)`389390Проверяет, является ли объект корректным элементом. *element* – это экземпляр элемента. Возвращает истинное значение, если это объект элемента.391392#### `xml.etree.ElementTree.iterparse(source, events=None, parser=None)`393394Разбирает фрагмент XML в дерево элементов поэтапно, уведомляя пользователя о ходе процесса. *source* – имя файла или [файловый объект](https://python-all.ru/3.5/glossary.html#term-file-object), содержащий XML-данные. *events* – последовательность событий, о которых нужно сообщать. Поддерживаемые события – это строки `"start"`, `"end"`, `"start-ns"` и `"end-ns"` (события «ns» используются для получения подробной информации о пространствах имён). Если *events* опущено, сообщаются только события `"end"`. *parser* – необязательный экземпляр парсера. Если не указан, используется стандартный парсер [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). *parser* должен быть подклассом [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) и может использовать только [`TreeBuilder`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) в качестве цели по умолчанию. Возвращает [итератор](https://python-all.ru/3.5/glossary.html#term-iterator), предоставляющий пары `(event, elem)`.395396Обратите внимание, что [`iterparse()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) строит дерево инкрементально, но выполняет блокирующие чтения из *source* (или указанного файла). Поэтому он не подходит для приложений, где блокирующие чтения недопустимы. Для полностью неблокирующего разбора см. [`XMLPullParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser).397398> **Примечание**399>400> [`iterparse()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) гарантирует только, что увидел символ «\>» начального тега, когда генерирует событие «start», поэтому атрибуты определены, но содержимое атрибутов text и tail на этот момент не определено. То же самое относится к дочерним элементам; они могут присутствовать или нет.401>402> Если нужен полностью заполненный элемент, используйте события "end".403404Устарело с версии 3.4: Аргумент *parser*.405406#### `xml.etree.ElementTree.parse(source, parser=None)`407408Разбирает XML-раздел в дерево элементов. *source* – это имя файла или файловый объект, содержащий XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree).409410#### `xml.etree.ElementTree.ProcessingInstruction(target, text=None)`411412Фабрика PI-элементов. Эта фабричная функция создаёт специальный элемент, который будет сериализован как инструкция обработки XML. *target* – строка, содержащая цель PI. *text* – строка, содержащая содержимое PI, если задано. Возвращает экземпляр элемента, представляющий инструкцию обработки.413414Обратите внимание, что [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) пропускает инструкции обработки во входных данных, вместо того чтобы создавать для них объекты комментариев. [`ElementTree`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) будет содержать узлы инструкций обработки, только если они были вставлены в дерево с помощью одного из методов [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).415416#### `xml.etree.ElementTree.register_namespace(prefix, uri)`417418Регистрирует префикс пространства имён. Реестр является глобальным, и любое существующее сопоставление для данного префикса или URI пространства имён будет удалено. *prefix* – префикс пространства имён. *uri* – URI пространства имён. Теги и атрибуты в этом пространстве имён будут сериализованы с указанным префиксом, если это возможно.419420Новое в версии 3.2.421422#### `xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)`423424Фабрика подэлементов. Эта функция создаёт экземпляр элемента и добавляет его к существующему элементу.425426Имя элемента, имена атрибутов и значения атрибутов могут быть как байтовыми строками, так и строками Unicode. *parent* – родительский элемент. *tag* – имя подэлемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы. Возвращает экземпляр элемента.427428#### `xml.etree.ElementTree.tostring(element, encoding="us-ascii", method="xml", *, short_empty_elements=True)`429430Генерирует строковое представление XML-элемента, включая все подэлементы. *element* – экземпляр [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element). *encoding* [\[1\]](https://python-all.ru/3.5/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.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write). Возвращает (опционально) закодированную строку, содержащую XML-данные.431432Новое в версии 3.4: параметр *short\_empty\_elements*.433434#### `xml.etree.ElementTree.tostringlist(element, encoding="us-ascii", method="xml", *, short_empty_elements=True)`435436Генерирует строковое представление XML-элемента, включая все подэлементы. *element* – экземпляр [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element). *encoding* [\[1\]](https://python-all.ru/3.5/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.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write). Возвращает список (опционально) закодированных строк, содержащих XML-данные. Не гарантируется определённый порядок, за исключением того, что `b"".join(tostringlist(element)) == tostring(element)`.437438Новое в версии 3.2.439440Новое в версии 3.4: параметр *short\_empty\_elements*.441442#### `xml.etree.ElementTree.XML(text, parser=None)`443444Разбирает XML-раздел из строковой константы. Эту функцию можно использовать для встраивания «XML-литералов» в код Python. *text* – строка, содержащая XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).445446#### `xml.etree.ElementTree.XMLID(text, parser=None)`447448Разбирает XML-фрагмент из строковой константы и возвращает словарь, сопоставляющий идентификаторы элементов с элементами. *text* – строка, содержащая XML-данные. *parser* – необязательный экземпляр анализатора. Если он не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает кортеж, содержащий экземпляр [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) и словарь.449450### 20.5.3.2. Объекты Element451452#### `class xml.etree.ElementTree.Element(tag, attrib={}, **extra)`453454Класс Element. Этот класс определяет интерфейс Element и предоставляет эталонную реализацию этого интерфейса.455456Имя элемента, имена атрибутов и значения атрибутов могут быть либо байтовыми строками, либо строками Unicode. *tag* – имя элемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы.457458#### `tag`459460Строка, определяющая, какие данные представляет этот элемент (иначе говоря, тип элемента).461462#### `text`463464#### `tail`465466Эти атрибуты можно использовать для хранения дополнительных данных, связанных с элементом. Их значениями обычно являются строки, но могут быть и любые объекты, специфичные для приложения. Если элемент создан из XML-файла, атрибут *text* содержит либо текст между начальным тегом элемента и его первым дочерним элементом или закрывающим тегом, либо `None`, а атрибут *tail* содержит либо текст между закрывающим тегом элемента и следующим тегом, либо `None`. Для XML-данных467468```xml469<a><b>1<c>2<d/>3</c></b>4</a>470```471472элемент *a* имеет `None` для обоих атрибутов *text* и *tail*, элемент *b* имеет *text* `"1"` и *tail* `"4"`, элемент *c* имеет *text* `"2"` и *tail* `None`, а элемент *d* имеет *text* `None` и *tail* `"3"`.473474Чтобы собрать внутренний текст элемента, см. [`itertext()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.itertext), например `"".join(element.itertext())`.475476Приложения могут хранить в этих атрибутах произвольные объекты.477478#### `attrib`479480Словарь, содержащий атрибуты элемента. Обратите внимание, что хотя значение *attrib* всегда является настоящим изменяемым словарём Python, реализация ElementTree может использовать другое внутреннее представление и создавать словарь только по запросу. Чтобы воспользоваться преимуществами таких реализаций, по возможности используйте приведённые ниже методы словаря.481482Следующие методы, подобные словарным, работают с атрибутами элемента.483484#### `clear()`485486Сбрасывает элемент. Эта функция удаляет все подэлементы, очищает все атрибуты и устанавливает атрибуты text и tail в `None`.487488#### `get(key, default=None)`489490Возвращает атрибут элемента с именем *key*.491492Возвращает значение атрибута или *default*, если атрибут не найден.493494#### `items()`495496Возвращает атрибуты элемента в виде последовательности пар (имя, значение). Атрибуты возвращаются в произвольном порядке.497498#### `keys()`499500Возвращает имена атрибутов элемента в виде списка. Имена возвращаются в произвольном порядке.501502#### `set(key, value)`503504Устанавливает атрибут *key* элемента в *value*.505506Следующие методы работают с дочерними элементами (подэлементами) текущего элемента.507508#### `append(subelement)`509510Добавляет элемент *subelement* в конец внутреннего списка подэлементов текущего элемента. Возбуждает [`TypeError`](https://python-all.ru/3.5/library/exceptions.html#TypeError), если *subelement* не является [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).511512#### `extend(subelements)`513514Добавляет *подэлементы* из последовательности с нулём или более элементов. Возбуждает [`TypeError`](https://python-all.ru/3.5/library/exceptions.html#TypeError), если подэлемент не является [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).515516Новое в версии 3.2.517518#### `find(match, namespaces=None)`519520Находит первый подэлемент, соответствующий *match*. *match* может быть именем тега или [путём](https://python-all.ru/3.5/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает экземпляр элемента или `None`. *namespaces* – необязательное отображение префикса пространства имён в полное имя.521522#### `findall(match, namespaces=None)`523524Находит все соответствующие подэлементы по имени тега или [пути](https://python-all.ru/3.5/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает список, содержащий все подходящие элементы в порядке документа. *namespaces* – необязательное отображение префикса пространства имён в полное имя.525526#### `findtext(match, default=None, namespaces=None)`527528Находит текст для первого подэлемента, соответствующего *match*. *match* может быть именем тега или [путём](https://python-all.ru/3.5/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает текстовое содержимое первого подходящего элемента или *default*, если элемент не найден. Обратите внимание: если у подходящего элемента нет текстового содержимого, возвращается пустая строка. *namespaces* – необязательное отображение префикса пространства имён в полное имя.529530#### `getchildren()`531532Устарело с версии 3.2: Используйте `list(elem)` или перебор.533534#### `getiterator(tag=None)`535536Устарело с версии 3.2: Вместо этого используйте метод [`Element.iter()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iter).537538#### `insert(index, subelement)`539540Вставляет *subelement* в указанную позицию в этом элементе. Возбуждает [`TypeError`](https://python-all.ru/3.5/library/exceptions.html#TypeError), если *subelement* не является [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).541542#### `iter(tag=None)`543544Создаёт древовидный [итератор](https://python-all.ru/3.5/glossary.html#term-iterator) с текущим элементом в качестве корня. Итератор перебирает этот элемент и все элементы ниже него в порядке документа (сначала в глубину). Если *tag* не равен `None` или `'*'`, из итератора возвращаются только элементы, тег которых равен *tag*. Если структура дерева изменяется во время итерации, результат не определён.545546Новое в версии 3.2.547548#### `iterfind(match, namespaces=None)`549550Находит все подходящие подэлементы по имени тега или [path](https://python-all.ru/3.5/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает итерируемый объект, выдающий все подходящие элементы в порядке документа. *namespaces* – необязательное отображение префикса пространства имён на полное имя.551552Новое в версии 3.2.553554#### `itertext()`555556Создаёт текстовый итератор. Итератор перебирает этот элемент и все подэлементы в порядке документа и возвращает весь внутренний текст.557558Новое в версии 3.2.559560#### `makeelement(tag, attrib)`561562Создаёт новый объект элемента того же типа, что и этот элемент. Не вызывайте этот метод, используйте вместо него фабричную функцию [`SubElement()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement).563564#### `remove(subelement)`565566Удаляет *subelement* из элемента. В отличие от методов find\*, этот метод сравнивает элементы по идентичности экземпляра, а не по значению тега или содержимому.567568Объекты [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) также поддерживают следующие методы последовательностей для работы с подэлементами: [`__delitem__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__delitem__), [`__getitem__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__getitem__), [`__setitem__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__setitem__), [`__len__()`](https://python-all.ru/3.5/reference/datamodel.html#object.__len__).569570Предупреждение: элементы без подэлементов будут проверяться как `False`. Это поведение изменится в будущих версиях. Вместо этого используйте конкретную проверку `len(elem)` или `elem is None`.571572```python573element = root.find('foo')574575if not element: # осторожно!576 print("element not found, or element has no subelements")577578if element is None:579 print("element not found")580```581582### 20.5.3.3. Объекты ElementTree583584#### `class xml.etree.ElementTree.ElementTree(element=None, file=None)`585586Класс-обёртка ElementTree. Этот класс представляет целую иерархию элементов и добавляет дополнительную поддержку сериализации в стандартный XML и из него.587588*element* – корневой элемент. Дерево инициализируется содержимым XML-*файла*, если он указан.589590#### `_setroot(element)`591592Заменяет корневой элемент этого дерева. При этом текущее содержимое дерева отбрасывается и заменяется указанным элементом. Используйте с осторожностью. *element* – экземпляр элемента.593594#### `find(match, namespaces=None)`595596То же, что и [`Element.find()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find), начиная с корня дерева.597598#### `findall(match, namespaces=None)`599600То же, что и [`Element.findall()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall), начиная с корня дерева.601602#### `findtext(match, default=None, namespaces=None)`603604То же, что и [`Element.findtext()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findtext), начиная с корня дерева.605606#### `getiterator(tag=None)`607608Устарело с версии 3.2: Вместо этого используйте метод [`ElementTree.iter()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.iter).609610#### `getroot()`611612Возвращает корневой элемент этого дерева.613614#### `iter(tag=None)`615616Создаёт и возвращает итератор дерева для корневого элемента. Итератор обходит все элементы этого дерева в порядке следования разделов. *tag* – это тег, который нужно искать (по умолчанию возвращаются все элементы).617618#### `iterfind(match, namespaces=None)`619620То же, что и [`Element.iterfind()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iterfind), начиная с корня дерева.621622Новое в версии 3.2.623624#### `parse(source, parser=None)`625626Загружает внешний XML-раздел в это дерево элементов. *source* – это имя файла или [файловый объект](https://python-all.ru/3.5/glossary.html#term-file-object). *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает корневой элемент раздела.627628#### `write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml", *, short_empty_elements=True)`629630Записывает дерево элементов в файл в формате XML. *file* – это имя файла или [файловый объект](https://python-all.ru/3.5/glossary.html#term-file-object), открытый для записи. *encoding* [\[1\]](https://python-all.ru/3.5/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` (по умолчанию), они выводятся как один самозакрывающийся тег, иначе – как пара открывающего и закрывающего тегов.631632Результат – либо строка ([`str`](https://python-all.ru/3.5/library/stdtypes.html#str)), либо двоичные данные ([`bytes`](https://python-all.ru/3.5/library/functions.html#bytes)). Это определяется аргументом *encoding*. Если *encoding* равен `"unicode"`, результатом будет строка; в противном случае – двоичные данные. Учтите, что это может конфликтовать с типом *file*, если это открытый [файловый объект](https://python-all.ru/3.5/glossary.html#term-file-object); убедитесь, что не пытаетесь записать строку в двоичный поток и наоборот.633634Новое в версии 3.4: параметр *short\_empty\_elements*.635636Это XML-файл, который будет обрабатываться:637638```python639<html>640 <head>641 <title>Example page</title>642 </head>643 <body>644 <p>Moved to <a href="http://example.org/">example.org</a>645 or <a href="http://example.com/">example.com</a>.</p>646 </body>647</html>648```649650Пример изменения атрибута «target» каждой ссылки в первом абзаце:651652```python653>>> from xml.etree.ElementTree import ElementTree654>>> tree = ElementTree()655>>> tree.parse("index.xhtml")656<Element 'html' at 0xb77e6fac>657>>> p = tree.find("body/p") # Находит первое вхождение тега p в body658>>> p659<Element 'p' at 0xb77ec26c>660>>> links = list(p.iter("a")) # Возвращает список всех ссылок661>>> links662[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]663>>> for i in links: # Перебирает все найденные ссылки664... i.attrib["target"] = "blank"665>>> tree.write("output.xhtml")666```667668### 20.5.3.4. Объекты QName669670#### `class xml.etree.ElementTree.QName(text_or_uri, tag=None)`671672Обёртка QName. Используется для обёртывания значения атрибута QName, чтобы при выводе обеспечить правильную обработку пространств имён. *text\_or\_uri* – строка, содержащая значение QName в форме {uri}local, или, если передан аргумент tag, – URI-часть QName. Если передан *tag*, то первый аргумент интерпретируется как URI, а этот аргумент – как локальное имя. Экземпляры [`QName`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.QName) непрозрачны.673674### 20.5.3.5. Объекты TreeBuilder675676#### `class xml.etree.ElementTree.TreeBuilder(element_factory=None)`677678Универсальный построитель структуры элементов. Этот построитель преобразует последовательность вызовов методов start, data и end в правильно сформированную структуру элементов. Этот класс можно использовать для построения структуры элементов с помощью пользовательского анализатора XML или анализатора для другого XML-подобного формата. *element\_factory*, если задан, должен быть вызываемым объектом, принимающим два позиционных аргумента: тег и словарь атрибутов. Ожидается, что он возвращает новый экземпляр элемента.679680#### `close()`681682Сбрасывает буферы построителя и возвращает элемент верхнего уровня документа. Возвращает экземпляр [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).683684#### `data(data)`685686Добавляет текст в текущий элемент. *data* является строкой. Это должна быть либо байтовая строка, либо строка Unicode.687688#### `end(tag)`689690Закрывает текущий элемент. *tag* – имя элемента. Возвращает закрытый элемент.691692#### `start(tag, attrs)`693694Открывает новый элемент. *tag* – имя элемента. *attrs* – словарь, содержащий атрибуты элемента. Возвращает открытый элемент.695696Кроме того, пользовательский объект [`TreeBuilder`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) может предоставлять следующий метод:697698#### `doctype(name, pubid, system)`699700Обрабатывает объявление doctype. *name* – имя doctype. *pubid* – публичный идентификатор. *system* – системный идентификатор. Этот метод не существует в классе [`TreeBuilder`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) по умолчанию.701702Новое в версии 3.2.703704### 20.5.3.6. Объекты XMLParser705706#### `class xml.etree.ElementTree.XMLParser(html=0, target=None, encoding=None)`707708Этот класс является низкоуровневым строительным блоком модуля. Он использует [`xml.parsers.expat`](https://python-all.ru/3.5/library/pyexpat.html#module-xml.parsers.expat) для эффективного, событийно-ориентированного разбора XML. Ему можно передавать XML-данные инкрементально с помощью метода [`feed()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.feed), а события разбора преобразуются в push-API – путем вызова колбэков на объекте *target*. Если *target* опущен, используется стандартный [`TreeBuilder`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder). Аргумент *html* исторически использовался для обратной совместимости и теперь является устаревшим. Если указан *encoding* [\[1\]](https://python-all.ru/3.5/library/xml.etree.elementtree.html#id5), его значение переопределяет кодировку, заданную в XML-файле.709710Устарело с версии 3.4: Аргумент *html*. Остальные аргументы следует передавать через ключевые слова для подготовки к удалению аргумента *html*.711712#### `close()`713714Завершает передачу данных парсеру. Возвращает результат вызова метода `close()` *цели*, переданной при создании; по умолчанию это корневой элемент документа.715716#### `doctype(name, pubid, system)`717718Устарело с версии 3.2: Определите метод [`TreeBuilder.doctype()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.doctype) на пользовательском целевом объекте TreeBuilder.719720#### `feed(data)`721722Передает данные парсеру. *data* – это закодированные данные.723724[`XMLParser.feed()`](https://python-all.ru/3.5/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.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.close) вызывает метод `close()` объекта *target*. [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) можно использовать не только для построения древовидной структуры. Вот пример подсчета максимальной глубины XML-файла:725726```python727>>> from xml.etree.ElementTree import XMLParser728>>> class MaxDepth: # Целевой объект парсера729... maxDepth = 0730... depth = 0731... def start(self, tag, attrib): # Вызывается для каждого открывающего тега.732... self.depth += 1733... if self.depth > self.maxDepth:734... self.maxDepth = self.depth735... def end(self, tag): # Вызывается для каждого закрывающего тега.736... self.depth -= 1737... def data(self, data):738... pass # С данными ничего делать не нужно.739... def close(self): # Вызывается, когда все данные проанализированы.740... return self.maxDepth741...742>>> target = MaxDepth()743>>> parser = XMLParser(target=target)744>>> exampleXml = """745... <a>746... <b>747... </b>748... <b>749... <c>750... <d>751... </d>752... </c>753... </b>754... </a>"""755>>> parser.feed(exampleXml)756>>> parser.close()7574758```759760### 20.5.3.7. Объекты XMLPullParser761762#### `class xml.etree.ElementTree.XMLPullParser(events=None)`763764Pull-парсер, подходящий для неблокирующих приложений. Его API на стороне ввода похож на API [`XMLParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser), но вместо вызова колбэков, [`XMLPullParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) собирает внутренний список событий разбора и позволяет читать их из него. *events* – это последовательность событий для отчёта. Поддерживаются строки событий `"start"`, `"end"`, `"start-ns"` и `"end-ns"` (события с «ns» используются для получения подробной информации о пространствах имён). Если *events* опущен, сообщаются только события `"end"`.765766#### `feed(data)`767768Передает парсеру данные в виде байтов.769770#### `close()`771772Сигнализирует парсеру, что поток данных завершен. В отличие от [`XMLParser.close()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.close), этот метод всегда возвращает [`None`](https://python-all.ru/3.5/library/constants.html#None). Любые события, еще не извлеченные на момент закрытия парсера, все еще можно прочитать с помощью [`read_events()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events).773774#### `read_events()`775776Возвращает итератор по событиям, которые были встречены в данных, поданных в парсер. Итератор возвращает пары `(event, elem)`, где *event* – это строка, представляющая тип события (например, `"end"`), а *elem* – это встреченный объект [`Element`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).777778События, предоставленные в предыдущем вызове [`read_events()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events), не будут возвращены снова. События потребляются из внутренней очереди только при извлечении из итератора, поэтому несколько читателей, параллельно выполняющих итерацию по итераторам, полученным из [`read_events()`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events), будут иметь непредсказуемые результаты.779780> **Примечание**781>782> [`XMLPullParser`](https://python-all.ru/3.5/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) гарантирует только, что при генерации события "start" был обнаружен символ "\>" открывающего тега, поэтому атрибуты определены, но содержимое атрибутов text и tail на этом этапе не определено. То же самое относится и к дочерним элементам: они могут присутствовать, а могут и нет.783>784> Если нужен полностью заполненный элемент, используйте события "end".785786Новое в версии 3.4.787788### 20.5.3.8. Исключения789790#### `class xml.etree.ElementTree.ParseError`791792Ошибка разбора XML, возникающая при сбое разбора в различных методах разбора этого модуля. Строковое представление экземпляра этого исключения будет содержать понятное пользователю сообщение об ошибке. Кроме того, будут доступны следующие атрибуты:793794#### `code`795796Числовой код ошибки от парсера expat. Список кодов ошибок и их значений см. в документации [`xml.parsers.expat`](https://python-all.ru/3.5/library/pyexpat.html#module-xml.parsers.expat).797798#### `position`799800Кортеж из номеров строки *line* и столбца *column*, указывающий, где произошла ошибка.801802Сноски803804| \[1\] | *([1](https://python-all.ru/3.5/library/xml.etree.elementtree.html#id1), [2](https://python-all.ru/3.5/library/xml.etree.elementtree.html#id2), [3](https://python-all.ru/3.5/library/xml.etree.elementtree.html#id3), [4](https://python-all.ru/3.5/library/xml.etree.elementtree.html#id4))* Строка кодировки, используемая в выводе XML, должна соответствовать применимым стандартам. Например, “UTF-8” является допустимой, а “UTF8” – нет. См. [https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.5/library/xml.etree.elementtree.html) и [https://www.iana.org/assignments/character-sets/character-sets.xhtml](https://python-all.ru/3.5/library/xml.etree.elementtree.html). |805| --- | --- |806