2. Как ElementTree представляет XML

Если вы работали с XML с помощью Document Object Model (DOM), вы обнаружите, что пакет lxml имеет совершенно другой способ представления документов в виде деревьев. В DOM деревья построены из узлов, представленных как экземпляры узлов. Некоторые узлы представляют собой экземпляры Element, представляющие целые элементы. Каждый элемент имеет набор дочерних узлов различных типов: Узлы элементов для дочерних элементов; Узлы атрибутов для атрибутов; и Текстовые узлы для текстового содержимого.

Вот небольшой фрагмент XHTML и его представление как дерева DOM:

Альтернативный текст
<p>To find out <em>more</em>, see the
<a href="http://www.w3.org/XML">standard</a>.</p>

На приведенной выше диаграмме показана концептуальная структура XML. В отличие от этого представление lxml документа XML создает дерево только одного типа узла: Element.

Основное различие между представлением ElementTree, используемым в lxml, и классическим представлением, - это объединение текста с элементами: оно очень отличается в lxml.

Экземпляр класса Element lxml содержит следующие свойства:

.tag
Имя элемента, например «p» для абзаца или «em» для emphasis.
.text
Текст внутри элемента, если он есть, до первого дочернего элемента. Этот атрибут None, если элемент пуст или не имеет текста перед первым дочерним элементом.
.tail
Текст, следующий за элементом. Это самый необычный обход. В модели DOM любой текст, следующий за элементом E, связан с родителем E; в lxml этот текст считается “tail” E.
.attrib
Словарь Python, содержащий имена атрибутов XML элемента и их соответствующие значения. Например, для элемента “<h2 class =” arch “id =” N15 “>”, атрибуты этого элемента будут словарем “{” class ”:” arch ”,” id ”:” N15 “}”.

(element children)

Чтобы получить доступ к подэлементам, рассматривайте элемент как список. Например, если узел является экземпляром элемента, узел [0] является первым подэлементом узла. Если узел не имеет каких-либо подэлементов, эта операция вызовет исключение IndexError.

Вы можете узнать количество подэлементов, используя функцию len (). Например, если узел имеет пять дочерних элементов, len (node) вернет значение 5.

Одним из преимуществ представления lxml является то, что теперь дерево состоит только из одного типа узлов: каждый узел является экземпляром элемента. Вот наш XML-фрагмент снова и изображение его представления в lxml.

Альтернативный текст
<p>To find out <em>more</em>, see the
<a href="http://www.w3.org/XML">standard</a>.</p>

Обратите внимание, что в представлении lxml текст «, see then» (который включает в себя новую строку) содержится в атрибуте .tail элемента em, не связанного с элементом p, как это было бы в представлении DOM. Так же ”.” в конце абзаца находится в атрибуте .tail элемента a (link).

Теперь, когда вы знаете, как XML представлен в lxml, есть три общие области применения.