xml.etree.elementtree.md
1> **Источник:** https://python-all.ru/3.4/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.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) – API ElementTree XML89Модуль [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) реализует простой и эффективный API для разбора и создания XML-данных.1011Изменено в версии 3.3: Этот модуль будет использовать быструю реализацию, когда это возможно. Модуль `xml.etree.cElementTree` устарел.1213> **Предупреждение**14>15> Модуль [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) не защищён от вредоносных данных. Если необходимо разбирать непроверенные или неаутентифицированные данные, см. [*уязвимости XML*](https://python-all.ru/3.4/library/xml.html#xml-vulnerabilities).1617## 20.5.1. Учебное руководство1819Это краткое руководство по использованию [`xml.etree.ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) (сокращённо `ET`). Цель – продемонстрировать некоторые строительные блоки и основные понятия модуля.2021### 20.5.1.1. XML-дерево и элементы2223XML по своей природе иерархический формат данных, и самый естественный способ его представления – дерево. `ET` предоставляет для этого два класса: [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) представляет весь XML-документ как дерево, а [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) представляет отдельный узел в этом дереве. Взаимодействие со всем документом (чтение и запись в/из файлов) обычно выполняется на уровне [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree). Взаимодействие с отдельным XML-элементом и его дочерними элементами выполняется на уровне [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).2425### 20.5.1.2. Разбор XML2627В этом разделе в качестве примера будет использоваться следующий XML-документ:2829```xml30<?xml version="1.0"?>31<data>32 <country name="Liechtenstein">33 <rank>1</rank>34 <year>2008</year>35 <gdppc>141100</gdppc>36 <neighbor name="Austria" direction="E"/>37 <neighbor name="Switzerland" direction="W"/>38 </country>39 <country name="Singapore">40 <rank>4</rank>41 <year>2011</year>42 <gdppc>59900</gdppc>43 <neighbor name="Malaysia" direction="N"/>44 </country>45 <country name="Panama">46 <rank>68</rank>47 <year>2011</year>48 <gdppc>13600</gdppc>49 <neighbor name="Costa Rica" direction="W"/>50 <neighbor name="Colombia" direction="E"/>51 </country>52</data>53```5455Данные можно импортировать, прочитав файл:5657```python58import xml.etree.ElementTree as ET59tree = ET.parse('country_data.xml')60root = tree.getroot()61```6263Или непосредственно из строки:6465```python66root = ET.fromstring(country_data_as_string)67```6869[`fromstring()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.fromstring) разбирает XML из строки непосредственно в [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), который является корневым элементом разобранного дерева. Другие функции разбора могут создавать [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree). Сверьтесь с документацией, чтобы быть уверенным.7071Будучи [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), `root` имеет тег и словарь атрибутов:7273```python74>>> root.tag75'data'76>>> root.attrib77{}78```7980У него также есть дочерние узлы, которые можно перебирать:8182```python83>>> for child in root:84... print(child.tag, child.attrib)85...86country {'name': 'Liechtenstein'}87country {'name': 'Singapore'}88country {'name': 'Panama'}89```9091Дочерние узлы вложены, и к конкретным дочерним узлам можно обратиться по индексу:9293```python94>>> root[0][1].text95'2008'96```9798> **Примечание**99>100> Не все элементы XML-входа станут элементами разобранного дерева. В настоящее время этот модуль пропускает XML-комментарии, инструкции обработки и объявления типа документа во входных данных. Тем не менее, деревья, построенные с помощью API этого модуля, а не путём разбора XML-текста, могут содержать комментарии и инструкции обработки; они будут включены при генерации XML-вывода. К объявлению типа документа можно получить доступ, передав пользовательский экземпляр [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) конструктору [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser).101102### 20.5.1.3. Pull API для неблокирующего разбора103104Большинство функций разбора, предоставляемых этим модулем, требуют чтения всего документа целиком перед возвратом какого-либо результата. Можно использовать [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) и передавать в него данные по частям, но это push-API, которое вызывает методы на цель-колбэк, что слишком низкоуровнево и неудобно для большинства задач. Иногда пользователь действительно хочет иметь возможность разбирать XML инкрементально, без блокирующих операций, наслаждаясь удобством полностью сконструированных объектов [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).105106Наиболее мощный инструмент для этого – [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser). Он не требует блокирующего чтения для получения XML-данных, а вместо этого получает данные инкрементально через вызовы [`XMLPullParser.feed()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.feed). Чтобы получить разобранные XML-элементы, вызовите [`XMLPullParser.read_events()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events). Вот пример:107108```python109>>> parser = ET.XMLPullParser(['start', 'end'])110>>> parser.feed('<mytag>sometext')111>>> list(parser.read_events())112[('start', <Element 'mytag' at 0x7fa66db2be58>)]113>>> parser.feed(' more text</mytag>')114>>> for event, elem in parser.read_events():115... print(event)116... print(elem.tag, 'text=', elem.text)117...118end119```120121Очевидный вариант использования – приложения, работающие в неблокирующем режиме, где XML-данные поступают из сокета или читаются постепенно с какого-либо устройства хранения. В таких случаях блокирующие чтения неприемлемы.122123Из-за своей гибкости [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) может быть неудобен для более простых сценариев использования. Если вы не против блокировки приложения при чтении XML-данных, но всё же хотите иметь возможность инкрементального разбора, обратите внимание на [`iterparse()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse). Он может быть полезен при чтении большого XML-документа, который не хочется полностью хранить в памяти.124125### 20.5.1.4. Поиск интересующих элементов126127[`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) имеет несколько полезных методов, которые помогают рекурсивно перебирать всё поддерево ниже него (его дочерние элементы, их дочерние и т.д.). Например, [`Element.iter()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iter):128129```python130>>> for neighbor in root.iter('neighbor'):131... print(neighbor.attrib)132...133{'name': 'Austria', 'direction': 'E'}134{'name': 'Switzerland', 'direction': 'W'}135{'name': 'Malaysia', 'direction': 'N'}136{'name': 'Costa Rica', 'direction': 'W'}137{'name': 'Colombia', 'direction': 'E'}138```139140[`Element.findall()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall) находит только элементы с тегом, которые являются прямыми дочерними элементами текущего элемента. [`Element.find()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find) находит *первый* дочерний элемент с определённым тегом, а [`Element.text`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.text) даёт доступ к текстовому содержимому элемента. [`Element.get()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.get) даёт доступ к атрибутам элемента:141142```python143>>> for country in root.findall('country'):144... rank = country.find('rank').text145... name = country.get('name')146... print(name, rank)147...148Liechtenstein 1149Singapore 4150Panama 68151```152153Более сложное задание критериев поиска элементов возможно с помощью [*XPath*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath).154155### 20.5.1.5. Изменение XML-файла156157[`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) предоставляет простой способ построения XML-документов и записи их в файлы. Метод [`ElementTree.write()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write) служит этой цели.158159После создания объект [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) можно изменять, напрямую меняя его поля (например, [`Element.text`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.text)), добавляя и изменяя атрибуты (метод [`Element.set()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.set)), а также добавляя новые дочерние элементы (например, с помощью [`Element.append()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.append)).160161Допустим, мы хотим увеличить на единицу ранг каждой страны и добавить атрибут `updated` элементу rank:162163```python164>>> for rank in root.iter('rank'):165... new_rank = int(rank.text) + 1166... rank.text = str(new_rank)167... rank.set('updated', 'yes')168...169>>> tree.write('output.xml')170```171172Теперь наш XML выглядит так:173174```xml175<?xml version="1.0"?>176<data>177 <country name="Liechtenstein">178 <rank updated="yes">2</rank>179 <year>2008</year>180 <gdppc>141100</gdppc>181 <neighbor name="Austria" direction="E"/>182 <neighbor name="Switzerland" direction="W"/>183 </country>184 <country name="Singapore">185 <rank updated="yes">5</rank>186 <year>2011</year>187 <gdppc>59900</gdppc>188 <neighbor name="Malaysia" direction="N"/>189 </country>190 <country name="Panama">191 <rank updated="yes">69</rank>192 <year>2011</year>193 <gdppc>13600</gdppc>194 <neighbor name="Costa Rica" direction="W"/>195 <neighbor name="Colombia" direction="E"/>196 </country>197</data>198```199200Элементы можно удалять с помощью [`Element.remove()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.remove). Допустим, мы хотим удалить все страны с рангом выше 50:201202```python203>>> for country in root.findall('country'):204... rank = int(country.find('rank').text)205... if rank > 50:206... root.remove(country)207...208>>> tree.write('output.xml')209```210211Теперь наш XML выглядит так:212213```xml214<?xml version="1.0"?>215<data>216 <country name="Liechtenstein">217 <rank updated="yes">2</rank>218 <year>2008</year>219 <gdppc>141100</gdppc>220 <neighbor name="Austria" direction="E"/>221 <neighbor name="Switzerland" direction="W"/>222 </country>223 <country name="Singapore">224 <rank updated="yes">5</rank>225 <year>2011</year>226 <gdppc>59900</gdppc>227 <neighbor name="Malaysia" direction="N"/>228 </country>229</data>230```231232### 20.5.1.6. Построение XML-документов233234Функция [`SubElement()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement) также предоставляет удобный способ создания новых дочерних элементов для заданного элемента:235236```python237>>> a = ET.Element('a')238>>> b = ET.SubElement(a, 'b')239>>> c = ET.SubElement(a, 'c')240>>> d = ET.SubElement(c, 'd')241>>> ET.dump(a)242<a><b /><c><d /></c></a>243```244245### 20.5.1.7. Разбор XML с пространствами имён246247Если XML-вход содержит [пространства имён](https://python-all.ru/3.4/library/xml.etree.elementtree.html), теги и атрибуты с префиксами вида `prefix:sometag` расширяются до `{uri}sometag`, где *префикс* заменяется на полный *URI*. Кроме того, если есть [пространство имён по умолчанию](https://python-all.ru/3.4/library/xml.etree.elementtree.html), полный URI добавляется ко всем тегам без префикса.248249Вот пример XML, в котором используются два пространства имён: одно с префиксом «fictional», а другое выступает в качестве пространства имён по умолчанию:250251```xml252<?xml version="1.0"?>253<actors xmlns:fictional="http://characters.example.com"254 xmlns="http://people.example.com">255 <actor>256 <name>John Cleese</name>257 <fictional:character>Lancelot</fictional:character>258 <fictional:character>Archie Leach</fictional:character>259 </actor>260 <actor>261 <name>Eric Idle</name>262 <fictional:character>Sir Robin</fictional:character>263 <fictional:character>Gunther</fictional:character>264 <fictional:character>Commander Clement</fictional:character>265 </actor>266</actors>267```268269Один из способов поиска и изучения этого XML-примера – вручную добавить URI к каждому тегу или атрибуту в xpath [`find()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find) или [`findall()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall):270271```python272root = fromstring(xml_text)273for actor in root.findall('{http://people.example.com}actor'):274 name = actor.find('{http://people.example.com}name')275 print(name.text)276 for char in actor.findall('{http://characters.example.com}character'):277 print(' |-->', char.text)278```279280Более удобный способ поиска в XML с пространствами имён – создать словарь с собственными префиксами и использовать их в функциях поиска:281282```python283ns = {'real_person': 'http://people.example.com',284 'role': 'http://characters.example.com'}285286for actor in root.findall('real_person:actor', ns):287 name = actor.find('real_person:name', ns)288 print(name.text)289 for char in actor.findall('role:character', ns):290 print(' |-->', char.text)291```292293Оба подхода выводят одно и то же:294295```python296John Cleese297 |--> Lancelot298 |--> Archie Leach299Eric Idle300 |--> Sir Robin301 |--> Gunther302 |--> Commander Clement303```304305### 20.5.1.8. Дополнительные ресурсы306307Смотрите [http://effbot.org/zone/element-index.htm](https://python-all.ru/3.4/library/xml.etree.elementtree.html) для обучающих материалов и ссылок на другую документацию.308309## 20.5.2. Поддержка XPath310311Этот модуль предоставляет ограниченную поддержку [XPath-выражений](https://python-all.ru/3.4/library/xml.etree.elementtree.html) для поиска элементов в дереве. Цель – поддержать небольшое подмножество сокращённого синтаксиса; полноценный движок XPath выходит за рамки модуля.312313### 20.5.2.1. Пример314315Вот пример, демонстрирующий некоторые возможности XPath модуля. Мы будем использовать XML-документ `countrydata` из раздела [*Разбор XML*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-parsing-xml):316317```python318import xml.etree.ElementTree as ET319320root = ET.fromstring(countrydata)321322# Элементы верхнего уровня323root.findall(".")324325# Все элементы 'neighbor', являющиеся внуками дочерних элементов 'country' верхнего уровня326# элементы327root.findall("./country/neighbor")328329# Узлы с name='Singapore', имеющие дочерний элемент 'year'330root.findall(".//year/..[@name='Singapore']")331332# Элементы 'year', являющиеся дочерними для узлов с name='Singapore'333root.findall(".//*[@name='Singapore']/year")334335# Все элементы 'neighbor', являющиеся вторым дочерним элементом своего родителя336root.findall(".//neighbor[2]")337```338339### 20.5.2.2. Поддерживаемый синтаксис XPath340341| Синтаксис | Значение |342| --- | --- |343| `тег` | Выбирает все дочерние элементы с заданным тегом. Например, `spam` выбирает все дочерние элементы с именем `spam`, а `spam/egg` выбирает все внучатые элементы с именем `egg` во всех дочерних элементах с именем `spam`. |344| `*` | Выбирает все дочерние элементы. Например, `*/egg` выбирает все внучатые элементы с именем `egg`. |345| `.` | Выбирает текущий узел. Это особенно полезно в начале пути, чтобы указать, что это относительный путь. |346| `//` | Выбирает все подэлементы на всех уровнях ниже текущего элемента. Например, `.//egg` выбирает все элементы `egg` во всём дереве. |347| `..` | Выбирает родительский элемент. Возвращает `None`, если путь пытается достичь предков начального элемента (элемента, для которого была вызвана функция `find`). |348| `[@attrib]` | Выбирает все элементы, у которых есть указанный атрибут. |349| `[@attrib='value']` | Выбирает все элементы, у которых указанный атрибут имеет заданное значение. Значение не может содержать кавычки. |350| `[tag]` | Выбирает все элементы, у которых есть дочерний элемент с именем `тег`. Поддерживаются только непосредственные дочерние элементы. |351| `[tag='text']` | Выбирает все элементы, у которых есть дочерний элемент с именем `tag`, полное текстовое содержимое которого, включая дочерние элементы, равно заданному `text`. |352| `[position]` | Выбирает все элементы, находящиеся на заданной позиции. Позицией может быть целое число (1 – это первая позиция), выражение `last()` (для последней позиции) или позиция относительно последней позиции (например, `last()-1`). |353354Предикаты (выражения в квадратных скобках) должны предваряться именем тега, звёздочкой или другим предикатом. Предикаты `position` должны предваряться именем тега.355356## 20.5.3. Справочник357358### 20.5.3.1. Функции359360#### `xml.etree.ElementTree.Comment(text=None)`361362Фабрика элементов Comment. Эта фабричная функция создаёт специальный элемент, который будет сериализован как XML-комментарий стандартным сериализатором. Строка комментария может быть как байтовой строкой, так и строкой Unicode. *text* – это строка, содержащая текст комментария. Возвращает экземпляр элемента, представляющий комментарий.363364Обратите внимание, что [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) пропускает комментарии во входных данных, вместо того чтобы создавать для них объекты комментариев. [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) будет содержать узлы комментариев, только если они были вставлены в дерево с помощью одного из методов [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).365366#### `xml.etree.ElementTree.dump(elem)`367368Записывает дерево элементов или структуру элементов в sys.stdout. Эту функцию следует использовать только для отладки.369370Точный формат вывода зависит от реализации. В этой версии он записывается как обычный XML-файл.371372*elem* – это дерево элементов или отдельный элемент.373374#### `xml.etree.ElementTree.fromstring(text)`375376Разбирает XML-фрагмент из строковой константы. То же, что и [`XML()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XML). *text* – это строка, содержащая XML-данные. Возвращает экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).377378#### `xml.etree.ElementTree.fromstringlist(sequence, parser=None)`379380Разбирает XML-документ из последовательности строковых фрагментов. *sequence* – это список или другая последовательность, содержащая фрагменты XML-данных. *parser* – это необязательный экземпляр анализатора. Если он не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).381382Новое в версии 3.2.383384#### `xml.etree.ElementTree.iselement(element)`385386Проверяет, является ли объект корректным элементом. *element* – это экземпляр элемента. Возвращает истинное значение, если это объект элемента.387388#### `xml.etree.ElementTree.iterparse(source, events=None, parser=None)`389390Разбирает XML-фрагмент в дерево элементов инкрементально и сообщает пользователю о происходящем. *source* – это имя файла или [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object), содержащий XML-данные. *events* – это последовательность событий, о которых нужно сообщать. Поддерживаются строки `"start"`, `"end"`, `"start-ns"` и `"end-ns"` (события «ns» используются для получения подробной информации о пространствах имён). Если *events* опущен, сообщаются только события `"end"`. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). *parser* должен быть подклассом [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) и может использовать только стандартный [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) в качестве цели. Возвращает [*итератор*](https://python-all.ru/3.4/glossary.html#term-iterator), предоставляющий пары `(event, elem)`.391392Обратите внимание, что хотя [`iterparse()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) строит дерево инкрементально, он выполняет блокирующие чтения из *source* (или файла, который он называет). Поэтому он не подходит для приложений, где блокирующие чтения недопустимы. Для полностью неблокирующего разбора см. [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser).393394> **Примечание**395>396> [`iterparse()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) гарантирует только то, что он увидел символ «\>» начального тега, когда порождает событие «start», поэтому атрибуты определены, но содержимое атрибутов text и tail на этом этапе не определено. То же самое касается дочерних элементов: они могут присутствовать, а могут и нет.397>398> Если нужен полностью заполненный элемент, используйте события "end".399400Устарело с версии 3.4: Аргумент *parser*.401402#### `xml.etree.ElementTree.parse(source, parser=None)`403404Разбирает XML-фрагмент в дерево элементов. *source* – это имя файла или файловый объект, содержащий XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree).405406#### `xml.etree.ElementTree.ProcessingInstruction(target, text=None)`407408Фабрика PI-элементов. Эта фабричная функция создаёт специальный элемент, который будет сериализован как инструкция обработки XML. *target* – строка, содержащая цель PI. *text* – строка, содержащая содержимое PI, если задано. Возвращает экземпляр элемента, представляющий инструкцию обработки.409410Обратите внимание, что [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) пропускает инструкции обработки во входных данных, а не создаёт для них объекты комментариев. [`ElementTree`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) будет содержать узлы инструкций обработки, только если они были вставлены в дерево с помощью одного из методов [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).411412#### `xml.etree.ElementTree.register_namespace(prefix, uri)`413414Регистрирует префикс пространства имён. Реестр является глобальным, и любое существующее сопоставление для данного префикса или URI пространства имён будет удалено. *prefix* – префикс пространства имён. *uri* – URI пространства имён. Теги и атрибуты в этом пространстве имён будут сериализованы с указанным префиксом, если это возможно.415416Новое в версии 3.2.417418#### `xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)`419420Фабрика подэлементов. Эта функция создаёт экземпляр элемента и добавляет его к существующему элементу.421422Имя элемента, имена атрибутов и значения атрибутов могут быть как байтовыми строками, так и строками Unicode. *parent* – родительский элемент. *tag* – имя подэлемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы. Возвращает экземпляр элемента.423424#### `xml.etree.ElementTree.tostring(element, encoding="us-ascii", method="xml", *, short_empty_elements=True)`425426Генерирует строковое представление XML-элемента, включая все дочерние элементы. *element* – это экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element). *encoding* [\[1\]](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id5) – это кодировка вывода (по умолчанию US-ASCII). Используйте `encoding="unicode"` для генерации строки Unicode (иначе генерируется байтовая строка). *method* может быть `"xml"`, `"html"` или `"text"` (по умолчанию `"xml"`). *short\_empty\_elements* имеет то же значение, что и в [`ElementTree.write()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write). Возвращает (опционально) закодированную строку, содержащую XML-данные.427428Новое в версии 3.4: параметр *short\_empty\_elements*.429430#### `xml.etree.ElementTree.tostringlist(element, encoding="us-ascii", method="xml", *, short_empty_elements=True)`431432Генерирует строковое представление XML-элемента, включая все дочерние элементы. *element* – это экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element). *encoding* [\[1\]](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id5) – это кодировка вывода (по умолчанию US-ASCII). Используйте `encoding="unicode"` для генерации строки Unicode (иначе генерируется байтовая строка). *method* может быть `"xml"`, `"html"` или `"text"` (по умолчанию `"xml"`). *short\_empty\_elements* имеет то же значение, что и в [`ElementTree.write()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write). Возвращает список (опционально) закодированных строк, содержащих XML-данные. Не гарантируется какой-либо определённый порядок, за исключением того, что `b"".join(tostringlist(element)) == tostring(element)`.433434Новое в версии 3.2.435436Новое в версии 3.4: параметр *short\_empty\_elements*.437438#### `xml.etree.ElementTree.XML(text, parser=None)`439440Разбирает XML-фрагмент из строковой константы. Эту функцию можно использовать для встраивания «XML-литералов» в код Python. *text* – это строка, содержащая XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).441442#### `xml.etree.ElementTree.XMLID(text, parser=None)`443444Разбирает XML-фрагмент из строковой константы, а также возвращает словарь, который сопоставляет идентификаторы элементов с элементами. *text* – это строка, содержащая XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает кортеж, содержащий экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) и словарь.445446### 20.5.3.2. Объекты Element447448#### `class xml.etree.ElementTree.Element(tag, attrib={}, **extra)`449450Класс Element. Этот класс определяет интерфейс Element и предоставляет эталонную реализацию этого интерфейса.451452Имя элемента, имена атрибутов и значения атрибутов могут быть либо байтовыми строками, либо строками Unicode. *tag* – имя элемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы.453454#### `tag`455456Строка, определяющая, какие данные представляет этот элемент (иначе говоря, тип элемента).457458#### `text`459460#### `tail`461462Эти атрибуты можно использовать для хранения дополнительных данных, связанных с элементом. Их значениями обычно являются строки, но могут быть и любые другие объекты, зависящие от приложения. Если элемент создан из XML-файла, атрибут *text* содержит либо текст между открывающим тегом элемента и его первым дочерним элементом или закрывающим тегом, либо `None`, а атрибут *tail* содержит либо текст между закрывающим тегом элемента и следующим тегом, либо `None`. Для XML-данных463464```xml465<a><b>1<c>2<d/>3</c></b>4</a>466```467468элемент *a* имеет `None` для обоих атрибутов *text* и *tail*, элемент *b* имеет *text* `"1"` и *tail* `"4"`, элемент *c* имеет *text* `"2"` и *tail* `None`, а элемент *d* имеет *text* `None` и *tail* `"3"`.469470Чтобы собрать внутренний текст элемента, см. [`itertext()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.itertext), например `"".join(element.itertext())`.471472Приложения могут хранить в этих атрибутах произвольные объекты.473474#### `attrib`475476Словарь, содержащий атрибуты элемента. Обратите внимание, что хотя значение *attrib* всегда является настоящим изменяемым словарём Python, реализация ElementTree может использовать другое внутреннее представление и создавать словарь только по запросу. Чтобы воспользоваться преимуществами таких реализаций, по возможности используйте приведённые ниже методы словаря.477478Следующие методы, подобные словарным, работают с атрибутами элемента.479480#### `clear()`481482Сбрасывает элемент. Эта функция удаляет все дочерние элементы, очищает все атрибуты и устанавливает атрибуты text и tail в `None`.483484#### `get(key, default=None)`485486Возвращает атрибут элемента с именем *key*.487488Возвращает значение атрибута или *default*, если атрибут не найден.489490#### `items()`491492Возвращает атрибуты элемента в виде последовательности пар (имя, значение). Атрибуты возвращаются в произвольном порядке.493494#### `keys()`495496Возвращает имена атрибутов элемента в виде списка. Имена возвращаются в произвольном порядке.497498#### `set(key, value)`499500Устанавливает атрибут *key* элемента в *value*.501502Следующие методы работают с дочерними элементами (подэлементами) текущего элемента.503504#### `append(subelement)`505506Добавляет элемент *subelement* в конец внутреннего списка дочерних элементов этого элемента. Возбуждает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), если *subelement* не является [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).507508#### `extend(subelements)`509510Добавляет *subelements* из объекта-последовательности с нулем или более элементов. Возбуждает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), если дочерний элемент не является [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).511512Новое в версии 3.2.513514#### `find(match, namespaces=None)`515516Находит первый дочерний элемент, соответствующий *match*. *match* может быть именем тега или [*путем*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает экземпляр элемента или `None`. *namespaces* – необязательное отображение префикса пространства имен на полное имя.517518#### `findall(match, namespaces=None)`519520Находит все соответствующие подэлементы по имени тега или [*пути*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает список, содержащий все подходящие элементы в порядке документа. *namespaces* – необязательное отображение префикса пространства имён в полное имя.521522#### `findtext(match, default=None, namespaces=None)`523524Находит текст для первого подэлемента, соответствующего *match*. *match* может быть именем тега или [*путём*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает текстовое содержимое первого подходящего элемента или *default*, если элемент не найден. Обратите внимание: если у подходящего элемента нет текстового содержимого, возвращается пустая строка. *namespaces* – необязательное отображение префикса пространства имён в полное имя.525526#### `getchildren()`527528Устарело с версии 3.2: Используйте `list(elem)` или итерацию.529530#### `getiterator(tag=None)`531532Устарело с версии 3.2: Вместо этого используйте метод [`Element.iter()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iter).533534#### `insert(index, subelement)`535536Вставляет *subelement* в заданную позицию в этом элементе. Возбуждает [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), если *subelement* не является [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).537538#### `iter(tag=None)`539540Создает древесный [*итератор*](https://python-all.ru/3.4/glossary.html#term-iterator) с текущим элементом в качестве корня. Итератор обходит этот элемент и все элементы ниже него в порядке документа (сначала вглубь). Если *tag* не равен `None` или `'*'`, из итератора возвращаются только элементы, чей тег равен *tag*. Если структура дерева изменяется во время итерации, результат не определен.541542Новое в версии 3.2.543544#### `iterfind(match, namespaces=None)`545546Находит все подходящие подэлементы по имени тега или [*path*](https://python-all.ru/3.4/library/xml.etree.elementtree.html#elementtree-xpath). Возвращает итерируемый объект, выдающий все подходящие элементы в порядке документа. *namespaces* – необязательное отображение префикса пространства имён на полное имя.547548Новое в версии 3.2.549550#### `itertext()`551552Создаёт текстовый итератор. Итератор перебирает этот элемент и все подэлементы в порядке документа и возвращает весь внутренний текст.553554Новое в версии 3.2.555556#### `makeelement(tag, attrib)`557558Создает новый объект элемента того же типа, что и этот элемент. Не вызывайте этот метод, вместо этого используйте фабричную функцию [`SubElement()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement).559560#### `remove(subelement)`561562Удаляет *subelement* из элемента. В отличие от методов find\*, этот метод сравнивает элементы по идентичности экземпляра, а не по значению тега или содержимому.563564[`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) объекты также поддерживают следующие методы последовательностного типа для работы с подэлементами: [`__delitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__delitem__), [`__getitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__getitem__), [`__setitem__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__setitem__), [`__len__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__len__).565566Внимание: элементы без подэлементов будут иметь значение `False` при проверке. Это поведение изменится в будущих версиях. Вместо этого используйте проверку `len(elem)` или `elem is None`.567568```python569element = root.find('foo')570571if not element: # осторожно!572 print("element not found, or element has no subelements")573574if element is None:575 print("element not found")576```577578### 20.5.3.3. Объекты ElementTree579580#### `class xml.etree.ElementTree.ElementTree(element=None, file=None)`581582Класс-обёртка ElementTree. Этот класс представляет целую иерархию элементов и добавляет дополнительную поддержку сериализации в стандартный XML и из него.583584*element* – корневой элемент. Дерево инициализируется содержимым XML-*файла*, если он указан.585586#### `_setroot(element)`587588Заменяет корневой элемент этого дерева. При этом текущее содержимое дерева отбрасывается и заменяется указанным элементом. Используйте с осторожностью. *element* – экземпляр элемента.589590#### `find(match, namespaces=None)`591592То же, что и [`Element.find()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find), начиная с корня дерева.593594#### `findall(match, namespaces=None)`595596То же, что и [`Element.findall()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall), начиная с корня дерева.597598#### `findtext(match, default=None, namespaces=None)`599600То же, что и [`Element.findtext()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findtext), начиная с корня дерева.601602#### `getiterator(tag=None)`603604Устарело с версии 3.2: Вместо этого используйте метод [`ElementTree.iter()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.iter).605606#### `getroot()`607608Возвращает корневой элемент этого дерева.609610#### `iter(tag=None)`611612Создаёт и возвращает итератор дерева для корневого элемента. Итератор обходит все элементы этого дерева в порядке следования разделов. *tag* – это тег, который нужно искать (по умолчанию возвращаются все элементы).613614#### `iterfind(match, namespaces=None)`615616То же, что и [`Element.iterfind()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iterfind), начиная с корня дерева.617618Новое в версии 3.2.619620#### `parse(source, parser=None)`621622Загружает внешний XML-раздел в это дерево элементов. *source* – это имя файла или [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object). *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает корневой элемент раздела.623624#### `write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml", *, short_empty_elements=True)`625626Записывает дерево элементов в файл в формате XML. *file* – это имя файла или [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object), открытый для записи. *encoding* [\[1\]](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id5) – это кодировка вывода (по умолчанию US-ASCII). *xml\_declaration* управляет добавлением XML-объявления в файл. Используйте `False` для отключения, `True` для всегда, `None` для добавления только если не US-ASCII, UTF-8 или Unicode (по умолчанию `None`). *default\_namespace* задаёт пространство имён XML по умолчанию (для “xmlns”). *method* может быть `"xml"`, `"html"` или `"text"` (по умолчанию `"xml"`). Параметр *short\_empty\_elements* (только ключевой аргумент) управляет форматированием элементов без содержимого. Если *True* (по умолчанию), они выводятся как один самозакрывающийся тег, иначе – как пара открывающего и закрывающего тегов.627628Результат может быть строкой ([`str`](https://python-all.ru/3.4/library/stdtypes.html#str)) или двоичными данными ([`bytes`](https://python-all.ru/3.4/library/functions.html#bytes)). Это управляется аргументом *encoding*. Если *encoding* равно `"unicode"`, результат – строка; в противном случае – двоичные данные. Обратите внимание, что это может конфликтовать с типом *file*, если это открытый [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object); убедитесь, что не пытаетесь записать строку в двоичный поток и наоборот.629630Новое в версии 3.4: параметр *short\_empty\_elements*.631632Это XML-файл, который будет обрабатываться:633634```python635<html>636 <head>637 <title>Example page</title>638 </head>639 <body>640 <p>Moved to <a href="http://example.org/">example.org</a>641 or <a href="http://example.com/">example.com</a>.</p>642 </body>643</html>644```645646Пример изменения атрибута «target» каждой ссылки в первом абзаце:647648```python649>>> from xml.etree.ElementTree import ElementTree650>>> tree = ElementTree()651>>> tree.parse("index.xhtml")652<Element 'html' at 0xb77e6fac>653>>> p = tree.find("body/p") # Находит первое вхождение тега p в body654>>> p655<Element 'p' at 0xb77ec26c>656>>> links = list(p.iter("a")) # Возвращает список всех ссылок657>>> links658[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]659>>> for i in links: # Перебирает все найденные ссылки660... i.attrib["target"] = "blank"661>>> tree.write("output.xhtml")662```663664### 20.5.3.4. Объекты QName665666#### `class xml.etree.ElementTree.QName(text_or_uri, tag=None)`667668Обёртка QName. Её можно использовать для обёртки значения атрибута QName, чтобы обеспечить правильную обработку пространств имён при выводе. *text\_or\_uri* – это строка, содержащая значение QName в формате {uri}local, или, если задан аргумент tag, часть URI QName. Если *tag* задан, первый аргумент интерпретируется как URI, а этот аргумент – как локальное имя. Экземпляры [`QName`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.QName) непрозрачны.669670### 20.5.3.5. Объекты TreeBuilder671672#### `class xml.etree.ElementTree.TreeBuilder(element_factory=None)`673674Универсальный построитель структуры элементов. Этот построитель преобразует последовательность вызовов методов start, data и end в правильно сформированную структуру элементов. Этот класс можно использовать для построения структуры элементов с помощью пользовательского анализатора XML или анализатора для другого XML-подобного формата. *element\_factory*, если задан, должен быть вызываемым объектом, принимающим два позиционных аргумента: тег и словарь атрибутов. Ожидается, что он возвращает новый экземпляр элемента.675676#### `close()`677678Сбрасывает буферы построителя и возвращает корневой элемент документа. Возвращает экземпляр [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).679680#### `data(data)`681682Добавляет текст в текущий элемент. *data* является строкой. Это должна быть либо байтовая строка, либо строка Unicode.683684#### `end(tag)`685686Закрывает текущий элемент. *tag* – имя элемента. Возвращает закрытый элемент.687688#### `start(tag, attrs)`689690Открывает новый элемент. *tag* – имя элемента. *attrs* – словарь, содержащий атрибуты элемента. Возвращает открытый элемент.691692Кроме того, пользовательский объект [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) может предоставлять следующий метод:693694#### `doctype(name, pubid, system)`695696Обрабатывает объявление типа документа. *name* – это имя типа документа. *pubid* – публичный идентификатор. *system* – системный идентификатор. Этот метод не существует в классе [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) по умолчанию.697698Новое в версии 3.2.699700### 20.5.3.6. Объекты XMLParser701702#### `class xml.etree.ElementTree.XMLParser(html=0, target=None, encoding=None)`703704Этот класс является низкоуровневым строительным блоком модуля. Он использует [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) для эффективного, событийно-ориентированного разбора XML. Данные XML можно передавать ему по частям с помощью метода [`feed()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.feed), и события разбора преобразуются в push-интерфейс (API) – вызовом колбэков на объекте *target*. Если *target* опущен, используется стандартный [`TreeBuilder`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder). Аргумент *html* исторически использовался для обратной совместимости и теперь устарел. Если передан *encoding* [\[1\]](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id5), его значение переопределяет кодировку, указанную в XML-файле.705706Устарело с версии 3.4: Аргумент *html*. Остальные аргументы следует передавать по имени, чтобы подготовиться к удалению аргумента *html*.707708#### `close()`709710Завершает передачу данных анализатору. Возвращает результат вызова метода `close()` объекта *target*, переданного при создании; по умолчанию это корневой элемент документа.711712#### `doctype(name, pubid, system)`713714Устарело с версии 3.2: Определите метод [`TreeBuilder.doctype()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.doctype) в собственном целевом объекте TreeBuilder.715716#### `feed(data)`717718Передает данные парсеру. *data* – это закодированные данные.719720[`XMLParser.feed()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.feed) вызывает метод `start(tag, attrs_dict)` объекта *target* для каждого открывающего тега, его метод `end(tag)` – для каждого закрывающего тега, а данные обрабатываются методом `data(data)`. [`XMLParser.close()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.close) вызывает метод `close()` объекта *target*. [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) можно использовать не только для построения древовидной структуры. Ниже приведен пример подсчета максимальной глубины XML-файла:721722```python723>>> from xml.etree.ElementTree import XMLParser724>>> class MaxDepth: # Целевой объект парсера725... maxDepth = 0726... depth = 0727... def start(self, tag, attrib): # Вызывается для каждого открывающего тега.728... self.depth += 1729... if self.depth > self.maxDepth:730... self.maxDepth = self.depth731... def end(self, tag): # Вызывается для каждого закрывающего тега.732... self.depth -= 1733... def data(self, data):734... pass # С данными ничего делать не нужно.735... def close(self): # Вызывается, когда все данные проанализированы.736... return self.maxDepth737...738>>> target = MaxDepth()739>>> parser = XMLParser(target=target)740>>> exampleXml = """741... <a>742... <b>743... </b>744... <b>745... <c>746... <d>747... </d>748... </c>749... </b>750... </a>"""751>>> parser.feed(exampleXml)752>>> parser.close()7534754```755756### 20.5.3.7. Объекты XMLPullParser757758#### `class xml.etree.ElementTree.XMLPullParser(events=None)`759760Pull-анализатор, подходящий для неблокирующих приложений. Его входной API похож на API [`XMLParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser), но вместо вызова колбэков на целевой объект, [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) собирает внутренний список событий разбора и позволяет читать из него. *events* – это последовательность событий, которые нужно возвращать. Поддерживаемые события – строки `"start"`, `"end"`, `"start-ns"` и `"end-ns"` (события “ns” используются для получения подробной информации о пространствах имён). Если *events* опущен, сообщаются только события `"end"`.761762#### `feed(data)`763764Передает парсеру данные в виде байтов.765766#### `close()`767768Сообщает анализатору, что поток данных завершен. В отличие от [`XMLParser.close()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.close), этот метод всегда возвращает [`None`](https://python-all.ru/3.4/library/constants.html#None). Любые события, еще не полученные на момент закрытия анализатора, всё еще можно прочитать с помощью [`read_events()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events).769770#### `read_events()`771772Возвращает итератор по событиям, которые были обнаружены в данных, переданных анализатору. Итератор выдает пары `(event, elem)`, где *event* – это строка, представляющая тип события (например, `"end"`), а *elem* – это обнаруженный объект [`Element`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).773774События, полученные при предыдущем вызове [`read_events()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events), не будут выданы снова. События извлекаются из внутренней очереди только тогда, когда они запрашиваются из итератора, поэтому при параллельном чтении несколькими читателями итераторов, полученных из [`read_events()`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser.read_events), результаты могут быть непредсказуемыми.775776> **Примечание**777>778> [`XMLPullParser`](https://python-all.ru/3.4/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLPullParser) гарантирует только то, что он увидел символ “\>” открывающего тега к моменту генерации события “start”, поэтому атрибуты уже определены, но содержимое атрибутов text и tail на этот момент не определено. То же самое относится и к дочерним элементам: они могут присутствовать, а могут и нет.779>780> Если нужен полностью заполненный элемент, используйте события "end".781782Новое в версии 3.4.783784### 20.5.3.8. Исключения785786#### `class xml.etree.ElementTree.ParseError`787788Ошибка разбора XML, возникающая при сбое разбора в различных методах разбора этого модуля. Строковое представление экземпляра этого исключения будет содержать понятное пользователю сообщение об ошибке. Кроме того, будут доступны следующие атрибуты:789790#### `code`791792Числовой код ошибки от анализатора expat. См. документацию [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) для получения списка кодов ошибок и их значений.793794#### `position`795796Кортеж из номеров строки *line* и столбца *column*, указывающий, где произошла ошибка.797798Сноски799800| \[1\] | *([1](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id1), [2](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id2), [3](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id3), [4](https://python-all.ru/3.4/library/xml.etree.elementtree.html#id4))* Строка кодировки, включённая в вывод XML, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустима, а «UTF8» – нет. См. [http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.4/library/xml.etree.elementtree.html) и [http://www.iana.org/assignments/character-sets/character-sets.xhtml](https://python-all.ru/3.4/library/xml.etree.elementtree.html). |801| --- | --- |802