xml.etree.elementtree.md
1> **Источник:** https://python-all.ru/2.7/library/xml.etree.elementtree.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.7. [`xml.etree.ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) – API ElementTree для XML89Новое в версии 2.5.1011**Исходный код:** [Lib/xml/etree/ElementTree.py](https://python-all.ru/src/2.7/Lib/xml/etree/ElementTree.py)1213---1415Тип [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) – гибкий объект-контейнер, предназначенный для хранения иерархических структур данных в памяти. Этот тип можно описать как нечто среднее между списком и словарём.1617> **Предупреждение**18>19> Модуль [`xml.etree.ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) не защищён от вредоносных данных. Если нужно разобрать непроверенные или неаутентифицированные данные, см. [уязвимости XML](https://python-all.ru/2.7/library/xml.html#xml-vulnerabilities).2021У каждого элемента есть несколько связанных с ним свойств:2223- тег – строка, определяющая, какие данные представляет этот элемент (то есть тип элемента).24- набор атрибутов, хранящихся в словаре Python.25- текстовая строка.26- необязательная строка tail.27- набор дочерних элементов, хранящихся в последовательности Python.2829Для создания экземпляра элемента используйте конструктор [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) или фабричную функцию [`SubElement()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement).3031Класс [`ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) можно использовать для обёртывания структуры элементов и преобразования её из XML и в XML.3233C-реализация этого API доступна как `xml.etree.cElementTree`.3435Смотрите [http://effbot.org/zone/element-index.htm](https://python-all.ru/2.7/library/xml.etree.elementtree.html) для учебных материалов и ссылок на другую документацию. На странице Фредрика Лундха также находится разрабатываемая версия xml.etree.ElementTree.3637Изменено в версии 2.7: API ElementTree обновлено до версии 1.3. Дополнительную информацию см. в [Введение в ElementTree 1.3](https://python-all.ru/2.7/library/xml.etree.elementtree.html).3839## 19.7.1. Учебное пособие4041Это краткое руководство по использованию [`xml.etree.ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) (`ET` в краткой форме). Цель – продемонстрировать некоторые основные компоненты и базовые концепции модуля.4243### 19.7.1.1. XML-дерево и элементы4445XML – это изначально иерархический формат данных, и наиболее естественный способ его представления – дерево. `ET` содержит два класса для этой цели: [`ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) представляет весь XML-документ как дерево, а [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) представляет отдельный узел в этом дереве. Взаимодействие со всем документом (чтение и запись в файлы/из файлов) обычно выполняется на уровне [`ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree). Взаимодействие с отдельным элементом XML и его дочерними элементами выполняется на уровне [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).4647### 19.7.1.2. Разбор XML4849В этом разделе в качестве примера будет использоваться следующий XML-документ:5051```xml52<?xml version="1.0"?>53<data>54 <country name="Liechtenstein">55 <rank>1</rank>56 <year>2008</year>57 <gdppc>141100</gdppc>58 <neighbor name="Austria" direction="E"/>59 <neighbor name="Switzerland" direction="W"/>60 </country>61 <country name="Singapore">62 <rank>4</rank>63 <year>2011</year>64 <gdppc>59900</gdppc>65 <neighbor name="Malaysia" direction="N"/>66 </country>67 <country name="Panama">68 <rank>68</rank>69 <year>2011</year>70 <gdppc>13600</gdppc>71 <neighbor name="Costa Rica" direction="W"/>72 <neighbor name="Colombia" direction="E"/>73 </country>74</data>75```7677Существует несколько способов импорта данных. Чтение файла с диска:7879```python80import xml.etree.ElementTree as ET81tree = ET.parse('country_data.xml')82root = tree.getroot()83```8485Чтение данных из строки:8687```python88root = ET.fromstring(country_data_as_string)89```9091[`fromstring()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.fromstring) разбирает XML из строки непосредственно в [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), который является корневым элементом разобранного дерева. Другие функции разбора могут создавать [`ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree). Для уточнения обратитесь к документации.9293Как [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), `root` имеет тег и словарь атрибутов:9495```python96>>> root.tag97'data'98>>> root.attrib99{}100```101102У него также есть дочерние узлы, которые можно перебирать:103104```python105>>> for child in root:106... print child.tag, child.attrib107...108country {'name': 'Liechtenstein'}109country {'name': 'Singapore'}110country {'name': 'Panama'}111```112113Дочерние узлы вложены, и к конкретным дочерним узлам можно обратиться по индексу:114115```python116>>> root[0][1].text117'2008'118```119120### 19.7.1.3. Поиск интересующих элементов121122[`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) имеет несколько полезных методов, которые помогают рекурсивно обходить всё поддерево под ним (его дочерние элементы, их дочерние элементы и так далее). Например, [`Element.iter()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iter):123124```python125>>> for neighbor in root.iter('neighbor'):126... print neighbor.attrib127...128{'name': 'Austria', 'direction': 'E'}129{'name': 'Switzerland', 'direction': 'W'}130{'name': 'Malaysia', 'direction': 'N'}131{'name': 'Costa Rica', 'direction': 'W'}132{'name': 'Colombia', 'direction': 'E'}133```134135[`Element.findall()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall) находит только элементы с тегом, которые являются прямыми дочерними элементами текущего элемента. [`Element.find()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find) находит *первый* дочерний элемент с указанным тегом, а [`Element.text`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.text) обращается к текстовому содержимому элемента. [`Element.get()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.get) обращается к атрибутам элемента:136137```python138>>> for country in root.findall('country'):139... rank = country.find('rank').text140... name = country.get('name')141... print name, rank142...143Liechtenstein 1144Singapore 4145Panama 68146```147148Более сложное задание критериев поиска элементов возможно с помощью [XPath](https://python-all.ru/2.7/library/xml.etree.elementtree.html#elementtree-xpath).149150### 19.7.1.4. Изменение XML-файла151152[`ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree) предоставляет простой способ создания XML-документов и записи их в файлы. Метод [`ElementTree.write()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.write) служит этой цели.153154После создания объект [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) можно изменять, напрямую меняя его поля (например, [`Element.text`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.text)), добавляя и изменяя атрибуты (метод [`Element.set()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.set)), а также добавляя новые дочерние элементы (например, с помощью [`Element.append()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.append)).155156Допустим, мы хотим увеличить ранг каждой страны на единицу и добавить атрибут `updated` к элементу ранга:157158```python159>>> for rank in root.iter('rank'):160... new_rank = int(rank.text) + 1161... rank.text = str(new_rank)162... rank.set('updated', 'yes')163...164>>> tree.write('output.xml')165```166167Теперь наш XML выглядит так:168169```xml170<?xml version="1.0"?>171<data>172 <country name="Liechtenstein">173 <rank updated="yes">2</rank>174 <year>2008</year>175 <gdppc>141100</gdppc>176 <neighbor name="Austria" direction="E"/>177 <neighbor name="Switzerland" direction="W"/>178 </country>179 <country name="Singapore">180 <rank updated="yes">5</rank>181 <year>2011</year>182 <gdppc>59900</gdppc>183 <neighbor name="Malaysia" direction="N"/>184 </country>185 <country name="Panama">186 <rank updated="yes">69</rank>187 <year>2011</year>188 <gdppc>13600</gdppc>189 <neighbor name="Costa Rica" direction="W"/>190 <neighbor name="Colombia" direction="E"/>191 </country>192</data>193```194195Элементы можно удалять с помощью [`Element.remove()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.remove). Допустим, мы хотим удалить все страны с рангом выше 50:196197```python198>>> for country in root.findall('country'):199... rank = int(country.find('rank').text)200... if rank > 50:201... root.remove(country)202...203>>> tree.write('output.xml')204```205206Теперь наш XML выглядит так:207208```xml209<?xml version="1.0"?>210<data>211 <country name="Liechtenstein">212 <rank updated="yes">2</rank>213 <year>2008</year>214 <gdppc>141100</gdppc>215 <neighbor name="Austria" direction="E"/>216 <neighbor name="Switzerland" direction="W"/>217 </country>218 <country name="Singapore">219 <rank updated="yes">5</rank>220 <year>2011</year>221 <gdppc>59900</gdppc>222 <neighbor name="Malaysia" direction="N"/>223 </country>224</data>225```226227### 19.7.1.5. Построение XML-документов228229Функция [`SubElement()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement) также предоставляет удобный способ создания новых дочерних элементов для заданного элемента:230231```python232>>> a = ET.Element('a')233>>> b = ET.SubElement(a, 'b')234>>> c = ET.SubElement(a, 'c')235>>> d = ET.SubElement(c, 'd')236>>> ET.dump(a)237<a><b /><c><d /></c></a>238```239240### 19.7.1.6. Разбор XML с пространствами имён241242Если во входном XML есть [пространства имён](https://python-all.ru/2.7/library/xml.etree.elementtree.html), теги и атрибуты с префиксами вида `prefix:sometag` раскрываются до `{uri}sometag`, где *префикс* заменяется полным *URI*. Кроме того, если есть [пространство имён по умолчанию](https://python-all.ru/2.7/library/xml.etree.elementtree.html), то этот полный URI добавляется в начало всех тегов без префикса.243244Вот пример XML, в котором используются два пространства имён: одно с префиксом «fictional», а другое выступает в качестве пространства имён по умолчанию:245246```xml247<?xml version="1.0"?>248<actors xmlns:fictional="http://characters.example.com"249 xmlns="http://people.example.com">250 <actor>251 <name>John Cleese</name>252 <fictional:character>Lancelot</fictional:character>253 <fictional:character>Archie Leach</fictional:character>254 </actor>255 <actor>256 <name>Eric Idle</name>257 <fictional:character>Sir Robin</fictional:character>258 <fictional:character>Gunther</fictional:character>259 <fictional:character>Commander Clement</fictional:character>260 </actor>261</actors>262```263264Один из способов поиска и изучения этого XML-примера – вручную добавить URI к каждому тегу или атрибуту в XPath-выражении [`find()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find) или [`findall()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall):265266```python267root = fromstring(xml_text)268for actor in root.findall('{http://people.example.com}actor'):269 name = actor.find('{http://people.example.com}name')270 print name.text271 for char in actor.findall('{http://characters.example.com}character'):272 print ' |-->', char.text273```274275Более удобный способ поиска в XML с пространствами имён – создать словарь с собственными префиксами и использовать их в функциях поиска:276277```python278ns = {'real_person': 'http://people.example.com',279 'role': 'http://characters.example.com'}280281for actor in root.findall('real_person:actor', ns):282 name = actor.find('real_person:name', ns)283 print name.text284 for char in actor.findall('role:character', ns):285 print ' |-->', char.text286```287288Оба подхода выводят одно и то же:289290```python291John Cleese292 |--> Lancelot293 |--> Archie Leach294Eric Idle295 |--> Sir Robin296 |--> Gunther297 |--> Commander Clement298```299300### 19.7.1.7. Дополнительные ресурсы301302Смотрите [http://effbot.org/zone/element-index.htm](https://python-all.ru/2.7/library/xml.etree.elementtree.html) для обучающих материалов и ссылок на другую документацию.303304## 19.7.2. Поддержка XPath305306Этот модуль предоставляет ограниченную поддержку [XPath-выражений](https://python-all.ru/2.7/library/xml.etree.elementtree.html) для поиска элементов в дереве. Цель – поддержать небольшое подмножество сокращённого синтаксиса; полноценный движок XPath выходит за рамки модуля.307308### 19.7.2.1. Пример309310Вот пример, демонстрирующий некоторые возможности XPath этого модуля. Будем использовать XML-документ `countrydata` из раздела [Разбор XML](https://python-all.ru/2.7/library/xml.etree.elementtree.html#elementtree-parsing-xml):311312```python313import xml.etree.ElementTree as ET314315root = ET.fromstring(countrydata)316317# Элементы верхнего уровня318root.findall(".")319320# Все элементы 'neighbor', являющиеся внуками дочерних элементов 'country' верхнего уровня321# элементы322root.findall("./country/neighbor")323324# Узлы с name='Singapore', имеющие дочерний элемент 'year'325root.findall(".//year/..[@name='Singapore']")326327# Элементы 'year', являющиеся дочерними для узлов с name='Singapore'328root.findall(".//*[@name='Singapore']/year")329330# Все элементы 'neighbor', являющиеся вторым дочерним элементом своего родителя331root.findall(".//neighbor[2]")332```333334### 19.7.2.2. Поддерживаемый синтаксис XPath335336| Синтаксис | Значение |337| --- | --- |338| `tag` | Выбирает все дочерние элементы с указанным тегом. Например, `spam` выбирает все дочерние элементы с именем `spam`, а `spam/egg` выбирает все внучатые элементы с именем `egg` во всех дочерних элементах с именем `spam`. |339| `*` | Выбирает все дочерние элементы. Например, `*/egg` выбирает все внучатые элементы с именем `egg`. |340| `.` | Выбирает текущий узел. Это особенно полезно в начале пути, чтобы указать, что это относительный путь. |341| `//` | Выбирает все вложенные элементы на всех уровнях ниже текущего элемента. Например, `.//egg` выбирает все элементы `egg` во всём дереве. |342| `..` | Выбирает родительский элемент. |343| `[@attrib]` | Выбирает все элементы, у которых есть указанный атрибут. |344| `[@attrib='value']` | Выбирает все элементы, у которых указанный атрибут имеет заданное значение. Значение не может содержать кавычки. |345| `[tag]` | Выбирает все элементы, у которых есть дочерний элемент с именем `tag`. Поддерживаются только непосредственные дочерние элементы. |346| `[tag='text']` | Выбирает все элементы, у которых есть дочерний элемент с именем `tag`, чьё полное текстовое содержимое, включая потомков, равно заданному `text`. |347| `[position]` | Выбирает все элементы, расположенные на указанной позиции. Позиция может быть целым числом (1 – первая позиция), выражением `last()` (для последней позиции) или позицией относительно последней позиции (например, `last()-1`). |348349Предикаты (выражения в квадратных скобках) должны предваряться именем тега, звёздочкой или другим предикатом. Предикаты `position` должны предваряться именем тега.350351## 19.7.3. Справочник352353### 19.7.3.1. Функции354355#### `xml.etree.ElementTree.Comment(text=None)`356357Фабрика элементов Comment. Эта фабричная функция создаёт специальный элемент, который будет сериализован как XML-комментарий стандартным сериализатором. Строка комментария может быть как байтовой строкой, так и строкой Unicode. *text* – это строка, содержащая текст комментария. Возвращает экземпляр элемента, представляющий комментарий.358359#### `xml.etree.ElementTree.dump(elem)`360361Записывает дерево элементов или структуру элементов в sys.stdout. Эту функцию следует использовать только для отладки.362363Точный формат вывода зависит от реализации. В этой версии он записывается как обычный XML-файл.364365*elem* – это дерево элементов или отдельный элемент.366367#### `xml.etree.ElementTree.fromstring(text)`368369Разбирает XML-раздел из строковой константы. То же, что и [`XML()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.XML). *text* – это строка, содержащая XML-данные. Возвращает экземпляр [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).370371#### `xml.etree.ElementTree.fromstringlist(sequence, parser=None)`372373Разбирает XML-документ из последовательности строковых фрагментов. *sequence* – это список или другая последовательность, содержащая фрагменты XML-данных. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).374375Новое в версии 2.7.376377#### `xml.etree.ElementTree.iselement(element)`378379Проверяет, является ли объект корректным элементом. *element* – это экземпляр элемента. Возвращает истинное значение, если это объект элемента.380381#### `xml.etree.ElementTree.iterparse(source, events=None, parser=None)`382383Разбирает XML-секцию в дерево элементов инкрементально и сообщает пользователю о происходящем. *source* – это имя файла или файловый объект, содержащий XML-данные. *events* – это список событий, о которых нужно сообщать. Если не указан, сообщается только о событиях «end». *parser* – необязательный экземпляр анализатора. Если не задан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). *parser* не поддерживается `cElementTree`. Возвращает [итератор](https://python-all.ru/2.7/glossary.html#term-iterator), предоставляющий пары `(event, elem)`.384385> **Примечание**386>387> [`iterparse()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse) гарантирует только, что при генерации события "start" был обнаружен символ "\>" открывающего тега, поэтому атрибуты определены, но содержимое атрибутов text и tail на этом этапе не определено. То же самое относится и к дочерним элементам: они могут присутствовать, а могут и нет.388>389> Если нужен полностью заполненный элемент, используйте события "end".390391#### `xml.etree.ElementTree.parse(source, parser=None)`392393Разбирает XML-раздел в дерево элементов. *source* – это имя файла или файловый объект, содержащий XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree).394395#### `xml.etree.ElementTree.ProcessingInstruction(target, text=None)`396397Фабрика PI-элементов. Эта фабричная функция создаёт специальный элемент, который будет сериализован как инструкция обработки XML. *target* – строка, содержащая цель PI. *text* – строка, содержащая содержимое PI, если задано. Возвращает экземпляр элемента, представляющий инструкцию обработки.398399#### `xml.etree.ElementTree.register_namespace(prefix, uri)`400401Регистрирует префикс пространства имён. Реестр является глобальным, и любое существующее сопоставление для данного префикса или URI пространства имён будет удалено. *prefix* – префикс пространства имён. *uri* – URI пространства имён. Теги и атрибуты в этом пространстве имён будут сериализованы с указанным префиксом, если это возможно.402403Новое в версии 2.7.404405#### `xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)`406407Фабрика подэлементов. Эта функция создаёт экземпляр элемента и добавляет его к существующему элементу.408409Имя элемента, имена атрибутов и значения атрибутов могут быть как байтовыми строками, так и строками Unicode. *parent* – родительский элемент. *tag* – имя подэлемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы. Возвращает экземпляр элемента.410411#### `xml.etree.ElementTree.tostring(element, encoding="us-ascii", method="xml")`412413Генерирует строковое представление XML-элемента, включая все подэлементы. *element* – это экземпляр [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element). *encoding* [1](https://python-all.ru/2.7/library/xml.etree.elementtree.html#id5) – это кодировка вывода (по умолчанию US-ASCII). *method* может быть `"xml"`, `"html"` или `"text"` (по умолчанию `"xml"`). Возвращает закодированную строку, содержащую XML-данные.414415#### `xml.etree.ElementTree.tostringlist(element, encoding="us-ascii", method="xml")`416417Генерирует строковое представление XML-элемента, включая все подэлементы. *element* – это экземпляр [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element). *encoding* [1](https://python-all.ru/2.7/library/xml.etree.elementtree.html#id5) – это кодировка вывода (по умолчанию US-ASCII). *method* может быть `"xml"`, `"html"` или `"text"` (по умолчанию `"xml"`). Возвращает список закодированных строк, содержащих XML-данные. Не гарантируется какой-либо определённый порядок, за исключением того, что `"".join(tostringlist(element)) == tostring(element)`.418419Новое в версии 2.7.420421#### `xml.etree.ElementTree.XML(text, parser=None)`422423Разбирает XML-раздел из строковой константы. Эту функцию можно использовать для встраивания «XML-литералов» в код Python. *text* – строка, содержащая XML-данные. *parser* – необязательный экземпляр анализатора. Если не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает экземпляр [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).424425#### `xml.etree.ElementTree.XMLID(text, parser=None)`426427Разбирает XML-фрагмент из строковой константы и возвращает словарь, сопоставляющий идентификаторы элементов с элементами. *text* – строка, содержащая XML-данные. *parser* – необязательный экземпляр анализатора. Если он не указан, используется стандартный анализатор [`XMLParser`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser). Возвращает кортеж, содержащий экземпляр [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) и словарь.428429### 19.7.3.2. Объекты Element430431#### `class xml.etree.ElementTree.Element(tag, attrib={}, **extra)`432433Класс Element. Этот класс определяет интерфейс Element и предоставляет эталонную реализацию этого интерфейса.434435Имя элемента, имена атрибутов и значения атрибутов могут быть либо байтовыми строками, либо строками Unicode. *tag* – имя элемента. *attrib* – необязательный словарь, содержащий атрибуты элемента. *extra* содержит дополнительные атрибуты, заданные как именованные аргументы.436437#### `tag`438439Строка, определяющая, какие данные представляет этот элемент (иначе говоря, тип элемента).440441#### `text`442443#### `tail`444445Эти атрибуты можно использовать для хранения дополнительных данных, связанных с элементом. Их значениями обычно являются строки, но могут быть и любые объекты, специфичные для приложения. Если элемент создан из XML-файла, атрибут *text* содержит либо текст между начальным тегом элемента и его первым дочерним элементом или закрывающим тегом, либо `None`, а атрибут *tail* содержит либо текст между закрывающим тегом элемента и следующим тегом, либо `None`. Для XML-данных446447```xml448<a><b>1<c>2<d/>3</c></b>4</a>449```450451элемент *a* имеет `None` для обоих атрибутов *text* и *tail*, элемент *b* имеет *text* `"1"` и *tail* `"4"`, элемент *c* имеет *text* `"2"` и *tail* `None`, а элемент *d* имеет *text* `None` и *tail* `"3"`.452453Чтобы собрать внутренний текст элемента, см. [`itertext()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.itertext), например `"".join(element.itertext())`.454455Приложения могут хранить в этих атрибутах произвольные объекты.456457#### `attrib`458459Словарь, содержащий атрибуты элемента. Обратите внимание, что хотя значение *attrib* всегда является настоящим изменяемым словарём Python, реализация ElementTree может использовать другое внутреннее представление и создавать словарь только по запросу. Чтобы воспользоваться преимуществами таких реализаций, по возможности используйте приведённые ниже методы словаря.460461Следующие методы, подобные словарным, работают с атрибутами элемента.462463#### `clear()`464465Сбрасывает элемент. Эта функция удаляет все подэлементы, очищает все атрибуты и устанавливает атрибуты text и tail в `None`.466467#### `get(key, default=None)`468469Возвращает атрибут элемента с именем *key*.470471Возвращает значение атрибута или *default*, если атрибут не найден.472473#### `items()`474475Возвращает атрибуты элемента в виде последовательности пар (имя, значение). Атрибуты возвращаются в произвольном порядке.476477#### `keys()`478479Возвращает имена атрибутов элемента в виде списка. Имена возвращаются в произвольном порядке.480481#### `set(key, value)`482483Устанавливает атрибут *key* элемента в *value*.484485Следующие методы работают с дочерними элементами (подэлементами) текущего элемента.486487#### `append(subelement)`488489Добавляет элемент *subelement* в конец внутреннего списка подэлементов данного элемента.490491#### `extend(subelements)`492493Добавляет *подэлементы* из объекта-последовательности с нулём или более элементами. Вызывает [`AssertionError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.AssertionError), если подэлемент не является допустимым объектом.494495Новое в версии 2.7.496497#### `find(match)`498499Находит первый подэлемент, соответствующий *match*. *match* может быть именем тега или путём. Возвращает экземпляр элемента или `None`.500501#### `findall(match)`502503Находит все подэлементы, соответствующие имени тега или пути. Возвращает список, содержащий все соответствующие элементы в порядке документа.504505#### `findtext(match, default=None)`506507Находит текст для первого подэлемента, соответствующего *match*. *match* может быть именем тега или путём. Возвращает текстовое содержимое первого соответствующего элемента или *default*, если элемент не найден. Обратите внимание, что если соответствующий элемент не имеет текстового содержимого, возвращается пустая строка.508509#### `getchildren()`510511Устарело с версии 2.7: Используйте `list(elem)` или итерацию.512513#### `getiterator(tag=None)`514515Устарело с версии 2.7: Вместо этого используйте метод [`Element.iter()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.iter).516517#### `insert(index, element)`518519Вставляет подэлемент в заданную позицию в данном элементе.520521#### `iter(tag=None)`522523Создаёт древовидный [итератор](https://python-all.ru/2.7/glossary.html#term-iterator) с текущим элементом в качестве корня. Итератор перебирает этот элемент и все элементы ниже него в порядке документа (сначала в глубину). Если *tag* не равен `None` или `'*'`, из итератора возвращаются только элементы, тег которых равен *tag*. Если структура дерева изменяется во время итерации, результат не определён.524525Новое в версии 2.7.526527#### `iterfind(match)`528529Находит все подэлементы, соответствующие имени тега или пути. Возвращает итерируемый объект, порождающий все соответствующие элементы в порядке документа.530531Новое в версии 2.7.532533#### `itertext()`534535Создаёт текстовый итератор. Итератор перебирает этот элемент и все подэлементы в порядке документа и возвращает весь внутренний текст.536537Новое в версии 2.7.538539#### `makeelement(tag, attrib)`540541Создаёт новый объект элемента того же типа, что и этот элемент. Не вызывайте этот метод, используйте вместо него фабричную функцию [`SubElement()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement).542543#### `remove(subelement)`544545Удаляет *subelement* из элемента. В отличие от методов find\*, этот метод сравнивает элементы по идентичности экземпляра, а не по значению тега или содержимому.546547Объекты [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) также поддерживают следующие методы последовательностей для работы с подэлементами: [`__delitem__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__delitem__), [`__getitem__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__getitem__), [`__setitem__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__setitem__), [`__len__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__len__).548549Предупреждение: элементы без подэлементов будут проверяться как `False`. Это поведение изменится в будущих версиях. Вместо этого используйте конкретную проверку `len(elem)` или `elem is None`.550551```python552element = root.find('foo')553554if not element: # осторожно!555 print "element not found, or element has no subelements"556557if element is None:558 print "element not found"559```560561### 19.7.3.3. Объекты ElementTree562563#### `class xml.etree.ElementTree.ElementTree(element=None, file=None)`564565Класс-обёртка ElementTree. Этот класс представляет целую иерархию элементов и добавляет дополнительную поддержку сериализации в стандартный XML и из него.566567*element* – корневой элемент. Дерево инициализируется содержимым XML-*файла*, если он указан.568569#### `_setroot(element)`570571Заменяет корневой элемент этого дерева. При этом текущее содержимое дерева отбрасывается и заменяется указанным элементом. Используйте с осторожностью. *element* – экземпляр элемента.572573#### `find(match)`574575То же, что и [`Element.find()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.find), начиная с корня дерева.576577#### `findall(match)`578579То же, что и [`Element.findall()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findall), начиная с корня дерева.580581#### `findtext(match, default=None)`582583То же, что и [`Element.findtext()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.findtext), начиная с корня дерева.584585#### `getiterator(tag=None)`586587Устарело с версии 2.7: Вместо этого используйте метод [`ElementTree.iter()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree.iter).588589#### `getroot()`590591Возвращает корневой элемент этого дерева.592593#### `iter(tag=None)`594595Создаёт и возвращает итератор дерева для корневого элемента. Итератор обходит все элементы этого дерева в порядке следования разделов. *tag* – это тег, который нужно искать (по умолчанию возвращаются все элементы).596597#### `iterfind(match)`598599Находит все подходящие подэлементы по имени тега или пути. То же, что и getroot().iterfind(match). Возвращает итератор, выдающий все подходящие элементы в порядке документа.600601Новое в версии 2.7.602603#### `parse(source, parser=None)`604605Загружает внешний XML-раздел в это дерево элементов. *source* – это имя файла или файловый объект. *parser* – необязательный экземпляр парсера. Если не указан, используется стандартный парсер XMLParser. Возвращает корневой элемент раздела.606607#### `write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None, method="xml")`608609Записывает дерево элементов в файл в формате XML. *file* – это имя файла или файловый объект, открытый для записи. *encoding* [1](https://python-all.ru/2.7/library/xml.etree.elementtree.html#id5) – это кодировка вывода (по умолчанию US-ASCII). *xml\_declaration* управляет добавлением XML-декларации в файл. Используйте `False` для отключения, `True` для принудительного включения, `None` для включения только если не US-ASCII или UTF-8 (по умолчанию `None`). *default\_namespace* задаёт пространство имён XML по умолчанию (для “xmlns”). *method* – это либо `"xml"`, `"html"` или `"text"` (по умолчанию `"xml"`). Возвращает закодированную строку.610611Это XML-файл, который будет обрабатываться:612613```python614<html>615 <head>616 <title>Example page</title>617 </head>618 <body>619 <p>Moved to <a href="http://example.org/">example.org</a>620 or <a href="http://example.com/">example.com</a>.</p>621 </body>622</html>623```624625Пример изменения атрибута «target» каждой ссылки в первом абзаце:626627```python628>>> from xml.etree.ElementTree import ElementTree629>>> tree = ElementTree()630>>> tree.parse("index.xhtml")631<Element 'html' at 0xb77e6fac>632>>> p = tree.find("body/p") # Находит первое вхождение тега p в body633>>> p634<Element 'p' at 0xb77ec26c>635>>> links = list(p.iter("a")) # Возвращает список всех ссылок636>>> links637[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]638>>> for i in links: # Перебирает все найденные ссылки639... i.attrib["target"] = "blank"640...641>>> tree.write("output.xhtml")642```643644### 19.7.3.4. Объекты QName645646#### `class xml.etree.ElementTree.QName(text_or_uri, tag=None)`647648Обёртка QName. Используется для обёртывания значения атрибута QName, чтобы при выводе обеспечить правильную обработку пространств имён. *text\_or\_uri* – строка, содержащая значение QName в форме {uri}local, или, если передан аргумент tag, – URI-часть QName. Если передан *tag*, то первый аргумент интерпретируется как URI, а этот аргумент – как локальное имя. Экземпляры [`QName`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.QName) непрозрачны.649650### 19.7.3.5. Объекты TreeBuilder651652#### `class xml.etree.ElementTree.TreeBuilder(element_factory=None)`653654Универсальный построитель структуры элементов. Этот построитель преобразует последовательность вызовов методов start, data и end в корректную структуру элементов. Этот класс можно использовать для построения структуры элементов с помощью пользовательского XML-парсера или парсера для другого XML-подобного формата. *element\_factory* вызывается для создания новых экземпляров [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element), если он указан.655656#### `close()`657658Сбрасывает буферы построителя и возвращает элемент верхнего уровня документа. Возвращает экземпляр [`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element).659660#### `data(data)`661662Добавляет текст в текущий элемент. *data* является строкой. Это должна быть либо байтовая строка, либо строка Unicode.663664#### `end(tag)`665666Закрывает текущий элемент. *tag* – имя элемента. Возвращает закрытый элемент.667668#### `start(tag, attrs)`669670Открывает новый элемент. *tag* – имя элемента. *attrs* – словарь, содержащий атрибуты элемента. Возвращает открытый элемент.671672Кроме того, пользовательский объект [`TreeBuilder`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) может предоставлять следующий метод:673674#### `doctype(name, pubid, system)`675676Обрабатывает объявление doctype. *name* – имя doctype. *pubid* – публичный идентификатор. *system* – системный идентификатор. Этот метод не существует в классе [`TreeBuilder`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder) по умолчанию.677678Новое в версии 2.7.679680### 19.7.3.6. Объекты XMLParser681682#### `class xml.etree.ElementTree.XMLParser(html=0, target=None, encoding=None)`683684[`Element`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element) построитель структуры для XML-данных, основанный на парсере expat. *html* – это предопределённые HTML-сущности. Этот флаг не поддерживается текущей реализацией. *target* – целевой объект. Если опущен, построитель использует экземпляр стандартного класса TreeBuilder. *encoding* [1](https://python-all.ru/2.7/library/xml.etree.elementtree.html#id5) необязателен. Если указан, значение переопределяет кодировку, заданную в XML-файле.685686#### `close()`687688Завершает передачу данных анализатору. Возвращает структуру элемента.689690#### `doctype(name, pubid, system)`691692Устарело с версии 2.7: Определите метод [`TreeBuilder.doctype()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.TreeBuilder.doctype) в пользовательском целевом объекте TreeBuilder.693694#### `feed(data)`695696Передает данные парсеру. *data* – это закодированные данные.697698[`XMLParser.feed()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.feed) вызывает метод `start()` объекта *target* для каждого открывающего тега, его метод `end()` для каждого закрывающего тега, а данные обрабатываются методом `data()`. [`XMLParser.close()`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser.close) вызывает метод `close()` объекта *target*. [`XMLParser`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#xml.etree.ElementTree.XMLParser) можно использовать не только для построения древовидной структуры. Это пример подсчёта максимальной глубины XML-файла:699700```python701>>> from xml.etree.ElementTree import XMLParser702>>> class MaxDepth: # Целевой объект парсера703... maxDepth = 0704... depth = 0705... def start(self, tag, attrib): # Вызывается для каждого открывающего тега.706... self.depth += 1707... if self.depth > self.maxDepth:708... self.maxDepth = self.depth709... def end(self, tag): # Вызывается для каждого закрывающего тега.710... self.depth -= 1711... def data(self, data):712... pass # С данными ничего делать не нужно.713... def close(self): # Вызывается, когда все данные проанализированы.714... return self.maxDepth715...716>>> target = MaxDepth()717>>> parser = XMLParser(target=target)718>>> exampleXml = """719... <a>720... <b>721... </b>722... <b>723... <c>724... <d>725... </d>726... </c>727... </b>728... </a>"""729>>> parser.feed(exampleXml)730>>> parser.close()7314732```733734Сноски735736**1([1](https://python-all.ru/2.7/library/xml.etree.elementtree.html#id1),[2](https://python-all.ru/2.7/library/xml.etree.elementtree.html#id2),[3](https://python-all.ru/2.7/library/xml.etree.elementtree.html#id3),[4](https://python-all.ru/2.7/library/xml.etree.elementtree.html#id4))**737738Строка кодировки, включенная в вывод XML, должна соответствовать соответствующим стандартам. Например, "UTF-8" допустима, а "UTF8" – нет. См. [https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/2.7/library/xml.etree.elementtree.html) и [https://www.iana.org/assignments/character-sets/character-sets.xhtml](https://python-all.ru/2.7/library/xml.etree.elementtree.html).739