Содержание страницы
19.7. xml.etree.ElementTree – API ElementTree для XML¶xml.etree.ElementTree – The ElementTree XML API
Новое в версии 2.5.
Исходный код: Lib/xml/etree/ElementTree.py
Тип Element – гибкий объект-контейнер, предназначенный для хранения иерархических структур данных в памяти. Этот тип можно описать как нечто среднее между списком и словарём.
Предупреждение
Модуль xml.etree.ElementTree не защищён от вредоносных данных. Если нужно разобрать непроверенные или неаутентифицированные данные, см. уязвимости XML.
У каждого элемента есть несколько связанных с ним свойств:
тег – строка, определяющая, какие данные представляет этот элемент (то есть тип элемента).
набор атрибутов, хранящихся в словаре Python.
текстовая строка.
необязательная строка tail.
набор дочерних элементов, хранящихся в последовательности Python.
Для создания экземпляра элемента используйте конструктор Element или фабричную функцию SubElement().
Класс ElementTree можно использовать для обёртывания структуры элементов и преобразования её из XML и в XML.
C-реализация этого API доступна как xml.etree.cElementTree.
Смотрите http://effbot.org/zone/element-index.htm для учебных материалов и ссылок на другую документацию. На странице Фредрика Лундха также находится разрабатываемая версия xml.etree.ElementTree.
Изменено в версии 2.7: API ElementTree обновлено до версии 1.3. Дополнительную информацию см. в Введение в ElementTree 1.3.
19.7.1. Учебное пособие¶Tutorial
Это краткое руководство по использованию xml.etree.ElementTree (ET в
краткой форме). Цель – продемонстрировать некоторые основные компоненты и базовые
концепции модуля.
19.7.1.1. XML-дерево и элементы¶XML tree and elements
XML – это изначально иерархический формат данных, и наиболее естественный способ его представления – дерево. ET содержит два класса для этой цели:
ElementTree представляет весь XML-документ как дерево, а
Element представляет отдельный узел в этом дереве. Взаимодействие со всем документом (чтение и запись в файлы/из файлов) обычно выполняется
на уровне ElementTree. Взаимодействие с отдельным элементом XML
и его дочерними элементами выполняется на уровне Element.
19.7.1.2. Разбор XML¶Parsing 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'
19.7.1.3. Поиск интересующих элементов¶Finding interesting elements
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.
19.7.1.4. Изменение XML-файла¶Modifying an XML File
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>
19.7.1.5. Построение XML-документов¶Building XML documents
Функция 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>
19.7.1.6. Разбор XML с пространствами имён¶Parsing XML with Namespaces
Если во входном 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
19.7.1.7. Дополнительные ресурсы¶Additional resources
Смотрите http://effbot.org/zone/element-index.htm для обучающих материалов и ссылок на другую документацию.
19.7.2. Поддержка XPath¶XPath support
Этот модуль предоставляет ограниченную поддержку XPath-выражений для поиска элементов в дереве. Цель – поддержать небольшое подмножество сокращённого синтаксиса; полноценный движок XPath выходит за рамки модуля.
19.7.2.1. Пример¶Example
Вот пример, демонстрирующий некоторые возможности XPath этого
модуля. Будем использовать XML-документ countrydata из раздела
Разбор XML:
import xml.etree.ElementTree as ET
root = ET.fromstring(countrydata)
# Элементы верхнего уровня
root.findall(".")
# Все элементы 'neighbor', являющиеся внуками дочерних элементов 'country' верхнего уровня
# элементы
root.findall("./country/neighbor")
# Узлы с name='Singapore', имеющие дочерний элемент 'year'
root.findall(".//year/..[@name='Singapore']")
# Элементы 'year', являющиеся дочерними для узлов с name='Singapore'
root.findall(".//*[@name='Singapore']/year")
# Все элементы 'neighbor', являющиеся вторым дочерним элементом своего родителя
root.findall(".//neighbor[2]")
19.7.2.2. Поддерживаемый синтаксис XPath¶Supported XPath syntax
Синтаксис |
Значение |
|---|---|
|
Выбирает все дочерние элементы с указанным тегом.
Например, |
|
Выбирает все дочерние элементы. Например, |
|
Выбирает текущий узел. Это особенно полезно в начале пути, чтобы указать, что это относительный путь. |
|
Выбирает все вложенные элементы на всех уровнях ниже
текущего элемента. Например, |
|
Выбирает родительский элемент. |
|
Выбирает все элементы, у которых есть указанный атрибут. |
|
Выбирает все элементы, у которых указанный атрибут имеет заданное значение. Значение не может содержать кавычки. |
|
Выбирает все элементы, у которых есть дочерний элемент с именем
|
|
Выбирает все элементы, у которых есть дочерний элемент с именем
|
|
Выбирает все элементы, расположенные на указанной
позиции. Позиция может быть целым числом
(1 – первая позиция), выражением |
Предикаты (выражения в квадратных скобках) должны предваряться именем тега, звёздочкой или другим предикатом. Предикаты position должны предваряться именем тега.
19.7.3. Справочник¶Reference
19.7.3.1. Функции¶Functions
-
xml.etree.ElementTree.Comment(text=None)¶ Фабрика элементов Comment. Эта фабричная функция создаёт специальный элемент, который будет сериализован как XML-комментарий стандартным сериализатором. Строка комментария может быть как байтовой строкой, так и строкой Unicode. 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)¶ Фабрика подэлементов. Эта функция создаёт экземпляр элемента и добавляет его к существующему элементу.
Имя элемента, имена атрибутов и значения атрибутов могут быть как байтовыми строками, так и строками Unicode. 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-фрагмент из строковой константы и возвращает словарь, сопоставляющий идентификаторы элементов с элементами. text – строка, содержащая XML-данные. parser – необязательный экземпляр анализатора. Если он не указан, используется стандартный анализатор
XMLParser. Возвращает кортеж, содержащий экземплярElementи словарь.
19.7.3.2. Объекты Element¶Element Objects
-
class
xml.etree.ElementTree.Element(tag, attrib={}, **extra)¶ Класс Element. Этот класс определяет интерфейс Element и предоставляет эталонную реализацию этого интерфейса.
Имя элемента, имена атрибутов и значения атрибутов могут быть либо байтовыми строками, либо строками Unicode. 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"и tailNone, а элемент d имеет textNoneи 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)¶ Добавляет подэлементы из объекта-последовательности с нулём или более элементами. Вызывает
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: # осторожно! print "element not found, or element has no subelements" if element is None: print "element not found"
-
19.7.3.3. Объекты ElementTree¶ElementTree Objects
-
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") # Находит первое вхождение тега p в body
>>> p
<Element 'p' at 0xb77ec26c>
>>> links = list(p.iter("a")) # Возвращает список всех ссылок
>>> links
[<Element 'a' at 0xb77ec2ac>, <Element 'a' at 0xb77ec1cc>]
>>> for i in links: # Перебирает все найденные ссылки
... i.attrib["target"] = "blank"
...
>>> tree.write("output.xhtml")
19.7.3.4. Объекты QName¶QName Objects
-
class
xml.etree.ElementTree.QName(text_or_uri, tag=None)¶ Обёртка QName. Используется для обёртывания значения атрибута QName, чтобы при выводе обеспечить правильную обработку пространств имён. text_or_uri – строка, содержащая значение QName в форме {uri}local, или, если передан аргумент tag, – URI-часть QName. Если передан tag, то первый аргумент интерпретируется как URI, а этот аргумент – как локальное имя. Экземпляры
QNameнепрозрачны.
19.7.3.5. Объекты TreeBuilder¶TreeBuilder Objects
-
class
xml.etree.ElementTree.TreeBuilder(element_factory=None)¶ Универсальный построитель структуры элементов. Этот построитель преобразует последовательность вызовов методов start, data и end в корректную структуру элементов. Этот класс можно использовать для построения структуры элементов с помощью пользовательского XML-парсера или парсера для другого XML-подобного формата. element_factory вызывается для создания новых экземпляров
Element, если он указан.-
close()¶ Сбрасывает буферы построителя и возвращает элемент верхнего уровня документа. Возвращает экземпляр
Element.
-
data(data)¶ Добавляет текст в текущий элемент. data является строкой. Это должна быть либо байтовая строка, либо строка Unicode.
-
end(tag)¶ Закрывает текущий элемент. tag – имя элемента. Возвращает закрытый элемент.
-
start(tag, attrs)¶ Открывает новый элемент. tag – имя элемента. attrs – словарь, содержащий атрибуты элемента. Возвращает открытый элемент.
Кроме того, пользовательский объект
TreeBuilderможет предоставлять следующий метод:-
doctype(name, pubid, system)¶ Обрабатывает объявление doctype. name – имя doctype. pubid – публичный идентификатор. system – системный идентификатор. Этот метод не существует в классе
TreeBuilderпо умолчанию.Новое в версии 2.7.
-
19.7.3.6. Объекты XMLParser¶XMLParser Objects
-
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: # Целевой объект парсера
... maxDepth = 0
... depth = 0
... def start(self, tag, attrib): # Вызывается для каждого открывающего тега.
... self.depth += 1
... if self.depth > self.maxDepth:
... self.maxDepth = self.depth
... def end(self, tag): # Вызывается для каждого закрывающего тега.
... self.depth -= 1
... def data(self, data):
... pass # С данными ничего делать не нужно.
... def close(self): # Вызывается, когда все данные проанализированы.
... 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.