Spec-Zone.ru › Python 2.7

xml.etree.ElementTree — API XML ElementTree

Новая версия 2.5.

Исходный код: Lib/xml/etree/ElementTree.py

Тип Element — это гибкий контейнерный объект, предназначенный для хранения иерархических структур данных в памяти. Его можно описать как нечто среднее между списком и словарем.

Предупреждение

Модуль xml.etree.ElementTree не защищен от вредоносно сконструированных данных. Если вам необходимо проанализировать недоверенные или неавторизованные данные, см. Уязвимости XML.

Каждый элемент имеет ряд свойств:

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

Для создания экземпляра элемента используйте конструктор Element или фабричную функцию SubElement().

Класс ElementTree может быть использован для упаковки структуры элементов и преобразования ее в XML и обратно.

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

См. http://effbot.org/zone/element-index.htm для руководств и ссылок на другие документы. Страница Фредрика Лундха также содержит версию разработки xml.etree.ElementTree.

Изменено в версии 2.7: API ElementTree обновлено до версии 1.3. Более подробную информацию см. в Представление ElementTree 1.3.

1. Руководство

Это краткое руководство по использованию xml.etree.ElementTree (кратко ET). Цель – продемонстрировать некоторые строительные блоки и основные понятия модуля.

1.1. Дерево XML и элементы

XML – это изначально иерархический формат данных, и наиболее естественный способ его представления – дерево. ET имеет два класса для этой цели – ElementTree представляет весь XML-документ в виде дерева, а Element – отдельный узел в этом дереве. Взаимодействие с целым документом (чтение и запись в/из файлов) обычно происходит на уровне ElementTree. Взаимодействие с отдельным XML-элементом и его подэлементами происходит на уровне Element.

1.2. Парсинг XML

Мы будем использовать следующий XML-документ в качестве примера данных для этого раздела:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

У нас есть несколько способов импортировать данные. Чтение файла с диска:

import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()

Чтение данных из строки:

root = ET.fromstring(country_data_as_string)

fromstring() парсит XML из строки непосредственно в Element, который является корневым элементом проанализированного дерева. Другие функции парсинга могут создавать ElementTree. Убедитесь в этом в документации.

Как Element, у root есть тег и словарь атрибутов:

>>> root.tag
'data'
>>> root.attrib
{}

У него также есть дочерние узлы, по которым мы можем итерировать:

>>> for child in root:
...     print child.tag, child.attrib
...
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}

Дочерние элементы вложены, и мы можем получить доступ к определённым дочерним узлам по индексу:

>>> root[0][1].text
'2008'

1.3. Поиск интересных элементов

Element имеет несколько полезных методов, которые помогают рекурсивно итерировать по всему поддереву ниже него (его дочерним элементам, их дочерним элементам и т. д.). Например, Element.iter():

>>> for neighbor in root.iter('neighbor'):
...     print neighbor.attrib
...
{'name': 'Austria', 'direction': 'E'}
{'name': 'Switzerland', 'direction': 'W'}
{'name': 'Malaysia', 'direction': 'N'}
{'name': 'Costa Rica', 'direction': 'W'}
{'name': 'Colombia', 'direction': 'E'}

Element.findall() находит только элементы с тегом, которые являются непосредственными дочерними элементами текущего элемента. Element.find() находит первый дочерний элемент с определённым тегом, а Element.text получает текстовое содержимое элемента. Element.get() получает атрибуты элемента:

>>> for country in root.findall('country'):
...     rank = country.find('rank').text
...     name = country.get('name')
...     print name, rank
...
Liechtenstein 1
Singapore 4
Panama 68

Более сложные условия для поиска элементов можно задать, используя XPath.

1.4. Модификация XML-файла

ElementTree предоставляет простой способ построения XML-документов и записи их в файлы. Метод ElementTree.write() служит для этой цели.

После создания объект Element может быть изменён путём прямого изменения его полей (таких как Element.text), добавления и изменения атрибутов (метод Element.set()), а также добавления новых дочерних элементов (например, с помощью Element.append()).

Предположим, что мы хотим добавить единицу к рейтингу каждой страны и добавить атрибут updated к элементу рейтинга:

>>> for rank in root.iter('rank'):
...     new_rank = int(rank.text) + 1
...     rank.text = str(new_rank)
...     rank.set('updated', 'yes')
...
>>> tree.write('output.xml')

Наш XML-документ теперь выглядит так:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

Мы можем удалить элементы с помощью Element.remove(). Предположим, что мы хотим удалить все страны с рейтингом выше 50:

>>> for country in root.findall('country'):
...     rank = int(country.find('rank').text)
...     if rank > 50:
...         root.remove(country)
...
>>> tree.write('output.xml')

Наш XML-документ теперь выглядит так:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
</data>

1.5. Создание XML-документов

Функция SubElement() также обеспечивает удобный способ создания новых подэлементов для заданного элемента:

>>> a = ET.Element('a')
>>> b = ET.SubElement(a, 'b')
>>> c = ET.SubElement(a, 'c')
>>> d = ET.SubElement(c, 'd')
>>> ET.dump(a)
<a><b /><c><d /></c></a>

1.6. Парсинг XML с именованными пространствами

Если входной XML-документ содержит именованные пространства, теги и атрибуты с префиксами в форме prefix:sometag преобразуются в {uri}sometag , где префикс заменяется полным URI. Также, если есть пространство имён по умолчанию, этот полный URI добавляется перед всеми тегами без префикса.

Вот пример XML, который включает два именованных пространства, одно с префиксом «fictional», а другое – в качестве пространства имён по умолчанию:

<?xml version="1.0"?>
<actors xmlns:fictional="http://characters.example.com"
        xmlns="http://people.example.com">
    <actor>
        <name>John Cleese</name>
        <fictional:character>Lancelot</fictional:character>
        <fictional:character>Archie Leach</fictional:character>
    </actor>
    <actor>
        <name>Eric Idle</name>
        <fictional:character>Sir Robin</fictional:character>
        <fictional:character>Gunther</fictional:character>
        <fictional:character>Commander Clement</fictional:character>
    </actor>
</actors>

Один из способов поиска и изучения этого XML-примера – вручную добавить URI к каждому тегу или атрибуту в xpath функции find() или findall():

root = fromstring(xml_text)
for actor in root.findall('{http://people.example.com}actor'):
    name = actor.find('{http://people.example.com}name')
    print name.text
    for char in actor.findall('{http://characters.example.com}character'):
        print ' |-->', char.text

Более лучший способ поиска в XML-примере с именованными пространствами – создать словарь со своими префиксами и использовать их в функциях поиска:

ns = {'real_person': 'http://people.example.com',
      'role': 'http://characters.example.com'}

for actor in root.findall('real_person:actor', ns):
    name = actor.find('real_person:name', ns)
    print name.text
    for char in actor.findall('role:character', ns):
        print ' |-->', char.text

Эти два подхода оба выведут:

John Cleese
 |--> Lancelot
 |--> Archie Leach
Eric Idle
 |--> Sir Robin
 |--> Gunther
 |--> Commander Clement

1.7. Дополнительные ресурсы

См. http://effbot.org/zone/element-index.htm для руководств и ссылок на другие документы.

2. Поддержка XPath

Этот модуль обеспечивает ограниченную поддержку XPath-выражений для поиска элементов в дереве. Цель – поддержать небольшой подмножество сокращённого синтаксиса; полный XPath-движок выходит за рамки модуля.

2.1. Пример

Вот пример, который демонстрирует некоторые возможности XPath модуля. Мы будем использовать countrydata XML-документ из раздела Парсинг XML:

import xml.etree.ElementTree as ET

root = ET.fromstring(countrydata)

# Top-level elements
root.findall(".")

# All 'neighbor' grand-children of 'country' children of the top-level
# elements
root.findall("./country/neighbor")

# Nodes with name='Singapore' that have a 'year' child
root.findall(".//year/..[@name='Singapore']")

# 'year' nodes that are children of nodes with name='Singapore'
root.findall(".//*[@name='Singapore']/year")

# All 'neighbor' nodes that are the second child of their parent
root.findall(".//neighbor[2]")

2.2. Поддерживаемый синтаксис XPath

Синтаксис

Значение

tag

Выбирает все дочерние элементы с заданным тегом. Например, spam выбирает все дочерние элементы с именем spam, а spam/egg выбирает всех правнуков с именем egg во всех дочерних элементах с именем spam.

*

Выбирает все дочерние элементы. Например, */egg выбирает всех правнуков с именем egg.

.

Выбирает текущий узел. Это в основном полезно в начале пути, чтобы указать, что это относительный путь.

//

Выбирает все подэлементы на всех уровнях под текущим элементом. Например, .//egg выбирает все элементы egg во всем дереве.

..

Выбирает родительский элемент.

[@attrib]

Выбирает все элементы, у которых есть заданный атрибут.

[@attrib='value']

Выбирает все элементы, для которых заданный атрибут имеет заданное значение. Значение не может содержать кавычки.

[tag]

Выбирает все элементы, у которых есть дочерний элемент с именем tag. Поддерживаются только непосредственные дочерние элементы.

[tag='text']

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

[position]

Выбирает все элементы, которые находятся в заданной позиции. Позиция может быть целым числом (1 — первая позиция), выражением last() (для последней позиции) или позицией, относительной к последней позиции (например, last()-1).

Предикаты (выражения в квадратных скобках) должны предшествовать имени тега, звездочке или другому предикату. position предикаты должны предшествовать имени тега.

3. Справочник

3.1. Функции

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

Производитель элементов комментариев. Эта функция-производитель создает специальный элемент, который будет сериализован как XML-комментарий стандартным сериализатором. Строка комментария может быть либо строкой байтов, либо строкой Юникода. text — строка, содержащая строку комментария. Возвращает экземпляр элемента, представляющий комментарий.

xml.etree.ElementTree.dump(elem)

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

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

elem — это древовидная структура элементов или отдельный элемент.

xml.etree.ElementTree.fromstring(text)

Парсит XML-раздел из константы строки. То же, что и XML(). text — строка, содержащая XML-данные. Возвращает экземпляр Element.

xml.etree.ElementTree.fromstringlist(sequence, parser=None)

Парсит XML-документ из последовательности фрагментов строк. sequence — список или другая последовательность, содержащая фрагменты XML-данных. parser — необязательный экземпляр парсера. Если не указано, используется стандартный парсер XMLParser. Возвращает экземпляр Element.

Введено в версии 2.7.

xml.etree.ElementTree.iselement(element)

Проверяет, является ли объект допустимым объектом элемента. element — экземпляр элемента. Возвращает истинное значение, если это объект элемента.

xml.etree.ElementTree.iterparse(source, events=None, parser=None)

Парсит XML-раздел в древовидную структуру элементов инкрементально и сообщает пользователю, что происходит. source — имя файла или объект файла, содержащий XML-данные. events — список событий, о которых необходимо сообщить обратно. Если опущено, сообщаются только события «end». parser — необязательный экземпляр парсера. Если не указано, используется стандартный парсер XMLParser. parser не поддерживается cElementTree. Возвращает итератор, предоставляющий пары (event, elem).

Примечание

iterparse() гарантирует только, что он увидел символ «>» начального тега при отправке события «start», поэтому атрибуты определены, но содержимое атрибутов text и tail в этот момент не определены. То же самое относится к дочерним элементам; они могут или не могут присутствовать.

Если вам нужен полностью заполненный элемент, ищите события «end».

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

Парсит XML-раздел в древовидную структуру элементов. source — имя файла или объект файла, содержащий XML-данные. parser — необязательный экземпляр парсера. Если не указано, используется стандартный парсер XMLParser. Возвращает экземпляр ElementTree.

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

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

xml.etree.ElementTree.register_namespace(prefix, uri)

Регистрирует префикс пространства имен. Регистр является глобальным, и любое существующее отображение для данного префикса или URI пространства имен будет удалено. prefix — префикс пространства имен. uri — URI пространства имен. Теги и атрибуты в этом пространстве имен будут сериализованы с заданным префиксом, если это возможно.

Введено в версии 2.7.

xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)

Производитель подэлементов. Эта функция создает экземпляр элемента и добавляет его к существующему элементу.

Имя элемента, имена атрибутов и значения атрибутов могут быть строками байтов или строками Юникода. parent — родительский элемент. tag — имя подэлемента. attrib — необязательный словарь, содержащий атрибуты элемента. extra содержит дополнительные атрибуты, заданные в качестве ключевых аргументов. Возвращает экземпляр элемента.

xml.etree.ElementTree.tostring(element, encoding="us-ascii", method="xml")

Генерирует строковое представление XML-элемента, включая все подэлементы. element — экземпляр Element. encoding 1 — кодировка вывода (по умолчанию — US-ASCII). method — либо "xml", "html" или "text" (по умолчанию — "xml"). Возвращает закодированную строку, содержащую XML-данные.

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

Генерирует строковое представление XML-элемента, включая все подэлементы. element — экземпляр Element. encoding 1 — кодировка вывода (по умолчанию — US-ASCII). method — либо "xml", "html" или "text" (по умолчанию — "xml"). Возвращает список закодированных строк, содержащих XML-данные. Не гарантирует никакой конкретной последовательности, за исключением "".join(tostringlist(element)) == tostring(element).

Введено в версии 2.7.

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

Парсит XML-раздел из константы строки. Эту функцию можно использовать для вставки «XML-литералов» в код Python. text — строка, содержащая XML-данные. parser — необязательный экземпляр парсера. Если не указано, используется стандартный парсер XMLParser. Возвращает экземпляр Element.

xml.etree.ElementTree.XMLID(text, parser=None)

Парсит XML-раздел из константы строки и также возвращает словарь, который отображает id элементов к элементам. text — строка, содержащая XML-данные. parser — необязательный экземпляр парсера. Если не указано, используется стандартный парсер XMLParser. Возвращает кортеж, содержащий экземпляр Element и словарь.

3.2. Объекты элементов

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

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

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

tag

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

text
tail

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

<a><b>1<c>2<d/>3</c></b>4</a>

элемент a имеет None для обоих атрибутов text и tail, элемент b имеет атрибут text "1" и tail "4", элемент c имеет атрибут text "2" и tail None, а элемент d имеет атрибут text None и tail "3".

Чтобы собрать внутренний текст элемента, см. itertext(), например "".join(element.itertext()).

Приложения могут хранить произвольные объекты в этих атрибутах.

attrib

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

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

clear()

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

get(key, default=None)

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

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

items()

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

keys()

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

set(key, value)

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

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

append(subelement)

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

extend(subelements)

Добавляет subelements из последовательного объекта с нулем или более элементами. Вызывает AssertionError, если подэлемент не является допустимым объектом.

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

find(match)

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

findall(match)

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

findtext(match, default=None)

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

getchildren()

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

getiterator(tag=None)

Устарело начиная с версии 2.7: Используйте метод Element.iter() вместо этого.

insert(index, element)

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

iter(tag=None)

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

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

iterfind(match)

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

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

itertext()

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

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

makeelement(tag, attrib)

Создаёт новый объект элемента того же типа, что и этот элемент. Не вызывайте этот метод, вместо этого используйте фабричную функцию SubElement().

remove(subelement)

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

Element объекты также поддерживают следующие методы типа последовательности для работы с подэлементами: __delitem__(), __getitem__(), __setitem__(), __len__().

Внимание: Элементы без подэлементов будут тестироваться как False. Это поведение изменится в будущих версиях. Используйте специфические len(elem) или elem is None проверки вместо этого.

element = root.find('foo')

if not element:  # careful!
    print "element not found, or element has no subelements"

if element is None:
    print "element not found"

3.3. Объекты ElementTree

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

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

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

_setroot(element)

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

find(match)

То же, что и Element.find(), начиная с корня дерева.

findall(match)

То же, что и Element.findall(), начиная с корня дерева.

findtext(match, default=None)

То же, что и Element.findtext(), начиная с корня дерева.

getiterator(tag=None)

Устарело начиная с версии 2.7: Используйте метод ElementTree.iter() вместо него.

getroot()

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

iter(tag=None)

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

iterfind(match)

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

Введено в версии 2.7.

parse(source, parser=None)

Загружает внешний XML-фрагмент в это дерево элементов. source — имя файла или объект файла. parser — необязательный экземпляр парсера. Если не указан, используется стандартный парсер XMLParser. Возвращает корневой элемент раздела.

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

Записывает дерево элементов в файл в формате XML. file — имя файла или объект файла, открытый для записи. encoding 1 — кодировка вывода (по умолчанию US-ASCII). xml_declaration управляет тем, будет ли добавлена декларация XML в файл. Используйте False для никогда, True для всегда, None только если не US-ASCII или UTF-8 (по умолчанию None). default_namespace устанавливает стандартный XML-пространство имён (для “xmlns”). method — это "xml", "html" или "text" (по умолчанию "xml"). Возвращает закодированную строку.

Это XML-файл, который будет обрабатываться:

<html>
    <head>
        <title>Example page</title>
    </head>
    <body>
        <p>Moved to <a href="http://example.org/">example.org</a>
        or <a href="http://example.com/">example.com</a>.</p>
    </body>
</html>

Пример изменения атрибута «target» каждого ссылки в первом абзаце:

>>> from xml.etree.ElementTree import ElementTree
>>> tree = ElementTree()
>>> tree.parse("index.xhtml")
<Element 'html' at 0xb77e6fac>
>>> p = tree.find("body/p")     # Finds first occurrence of tag p in body
>>> p
<Element 'p' at 0xb77ec26c>
>>> links = list(p.iter("a"))   # Returns list of all links
>>> links
[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]
>>> for i in links:             # Iterates through all found links
...     i.attrib["target"] = "blank"
...
>>> tree.write("output.xhtml")

3.4. Объекты QName

class xml.etree.ElementTree.QName(text_or_uri, tag=None)

Обёртка QName. Это можно использовать для обёртывания значения атрибута QName, чтобы обеспечить правильную обработку пространства имён при выводе. text_or_uri — строка, содержащая значение QName в форме {uri}local, или, если задан аргумент tag, часть URI QName. Если задан tag, первый аргумент интерпретируется как URI, а этот аргумент интерпретируется как локальное имя. Экземпляры QName непрозрачны.

3.5. Объекты TreeBuilder

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

Универсальный конструктор структуры элементов. Этот конструктор преобразует последовательность вызовов методов start, data и end в хорошо сформированную структуру элементов. Вы можете использовать этот класс для создания структуры элементов с помощью пользовательского XML-парсера или парсера для какого-либо другого формата, похожего на XML. element_factory вызывается для создания новых экземпляров Element при передаче.

close()

Очищает буферы конструктора и возвращает корневой элемент документа. Возвращает экземпляр Element.

data(data)

Добавляет текст к текущему элементу. data — строка. Это должна быть либо строка байтов, либо строка Юникод.

end(tag)

Закрывает текущий элемент. tag — имя элемента. Возвращает закрытый элемент.

start(tag, attrs)

Открывает новый элемент. tag — имя элемента. attrs — словарь, содержащий атрибуты элемента. Возвращает открытый элемент.

Кроме того, пользовательский объект TreeBuilder может предоставить следующий метод:

doctype(name, pubid, system)

Обрабатывает объявление типа документа. name — имя типа документа. pubid — общественный идентификатор. system — системный идентификатор. Этот метод не существует в стандартном классе TreeBuilder.

Введено в версии 2.7.

3.6. Объекты XMLParser

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

Конструктор структуры Element для XML-исходных данных, основанный на парсере expat. html — предопределённые HTML-сущности. Этот флаг не поддерживается текущей реализацией. target — целевой объект. Если опущен, конструктор использует экземпляр стандартного класса TreeBuilder. encoding 1 — необязательно. Если задано, значение переопределяет кодировку, указанную в XML-файле.

close()

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

doctype(name, pubid, system)

Устарело начиная с версии 2.7: Определите метод TreeBuilder.doctype() в целевом объекте TreeBuilder.

feed(data)

Подает данные в парсер. data — закодированные данные.

XMLParser.feed() вызывает метод start() в target для каждого открывающего тега, метод end() для каждого закрывающего тега, и данные обрабатываются методом data(). XMLParser.close() вызывает метод close() в target. XMLParser может использоваться не только для построения структуры дерева. Пример подсчёта максимальной глубины XML-файла:

>>> from xml.etree.ElementTree import XMLParser
>>> class MaxDepth:                     # The target object of the parser
...     maxDepth = 0
...     depth = 0
...     def start(self, tag, attrib):   # Called for each opening tag.
...         self.depth += 1
...         if self.depth > self.maxDepth:
...             self.maxDepth = self.depth
...     def end(self, tag):             # Called for each closing tag.
...         self.depth -= 1
...     def data(self, data):
...         pass            # We do not need to do anything with data.
...     def close(self):    # Called when all data has been parsed.
...         return self.maxDepth
...
>>> target = MaxDepth()
>>> parser = XMLParser(target=target)
>>> exampleXml = """
... <a>
...   <b>
...   </b>
...   <b>
...     <c>
...       <d>
...       </d>
...     </c>
...   </b>
... </a>"""
>>> parser.feed(exampleXml)
>>> parser.close()
4

Примечания

1(1,2,3,4)

Строка кодировки, включённая в XML-вывод, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, но «UTF8» — нет. См. https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl и https://www.iana.org/assignments/character-sets/character-sets.xhtml.

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/xml.etree.elementtree.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API