Работа с XML из Python

Введение

Не все элементы входных данных XML будут в конечном итоге являться элементами анализируемого дерева. В настоящий момент этот модуль пропускает все комментарии XML, инструкции по обработке и объявления типа документа во входных данных. Тем не менее, деревья, построенные с использованием API этого модуля, а не синтаксического анализа из XML-текста, могут иметь комментарии и инструкции по обработке в них.

Создание и сборка XML-документов

Импорт модуля Элемента Дерева

import xml.etree.ElementTree as ET

Функция Element () используется для создания элементов XML

p=ET.Element('parent')

Функция SubElement (), используемая для создания вложенных элементов в элементе give

c = ET.SubElement(p, 'child1')
 

Функция dump() используется для вывода элементов xml.

ET.dump(p)

# <parent><child1 /></parent>

Если вы хотите сохранить в файл, создайте дерево XML с функцией ElementTree() и сохраните в файл, используя метод write()

tree = ET.ElementTree(p)
tree.write("sample.xml")

Функция Comment() используется для вставки комментариев в XML-файл.

comment = ET.Comment('user comment')
p.append(comment) #этот комментарий будет добавлен к родительскому элементу

ET.dump(p)

# <parent><child1 /><!--user comment--></parent>

Изменение файла XML

Импортируйте модуль ElementTree и откройте файл XML, получите элемент XML

import xml.etree.ElementTree as ET
tree = ET.parse('sample.xml')
root=tree.getroot()
element = root[0] #получите первого ребенка родительского корня
element

# <Element 'child1' at 0x7fa5806a8b90>

Элементом объекта  можно управлять, изменяя его поля, добавляя и изменяя атрибуты, добавляя и удаляя дочерние элементы

element.set('attribute_name', 'attribute_value') #установите артрибут xml элементу
element.text="string_text"

Если вы хотите удалить элемент, используйте метод Element.remove()

root.remove(element)

Метод ElementTree.write(), используемый для вывода объекта XML в файлы XML.

tree.write('sample.xml')

Открытие и чтение больших файлов XML с помощью iterparse (инкрементальный анализ)

Иногда мы не хотим загружать весь XML-файл, чтобы получить необходимую нам информацию. В этих случаях полезно постепенно загружать соответствующие разделы и затем удалять их, когда мы закончим. С помощью функции iterparse вы можете редактировать дерево элементов, которое хранится при разборе XML.

Импортируйте объект ElementTree:

 import xml.etree.ElementTree as ET

 

Откройте файл .xml и переберите все элементы:

for event, elem in ET.iterparse("yourXMLfile.xml"):

#    ...  сделайте что-нибудь ...

Кроме того, мы можем искать только определенные события, такие как начальный / конечный теги или пространства имен. Если эта опция не указана (как указано выше), возвращаются только события «end»:

events=("start", "end", "start-ns", "end-ns")
for event, elem in ET.iterparse("yourXMLfile.xml", events=events):

#   ... сделайте что-нибудь ...

 

Вот полный пример, показывающий, как очистить элементы из дерева в памяти, когда мы закончим с ними:

for event, elem in ET.iterparse("yourXMLfile.xml", events=("start","end")):        
    if elem.tag == "record_tag" and event == "end":
        print elem.text
        elem.clear()

#    ... сделайтe что-нибудь другое ...

Открытие и чтение с помощью ElementTree

Импортируйте объект ElementTree, откройте соответствующий XML-файл и получите корневой тег:

import xml.etree.ElementTree as ET
tree = ET.parse("yourXMLfile.xml")
root = tree.getroot()

Есть несколько способов поиска по дереву. Сначала по итерации:

for child in root:
	print(child.tag, child.attrib)

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

print(root[0][1].text)

Для поиска конкретных тегов по имени, используйте .find или .findall:

print(root.findall("myTag"))
print(root[0].find("myOtherTag")) 

Поиск в XML с помощью XPath

Начиная с версии 2.7 ElementTree имеет лучшую поддержку XPath запросов. XPath - это синтаксис, позволяющий вам перемещаться по XML, как SQL используется для поиска в базе данных. Как find и findall функции поддержки XPath. Xml ниже будет использоваться для этого примера

<Catalog>
    <Books>
        <Book id="1" price="7.95">
            <Title>Мечтают ли андроиды об электроовцах?</Title>
            <Author>Philip K. Dick</Author>
        </Book>
        <Book id="5" price="5.95">
            <Title>The Colour of Magic</Title>
            <Author>Terry Pratchett</Author>
        </Book>
        <Book id="7" price="6.95">
            <Title>The Eye of The World</Title>
            <Author>Robert Jordan</Author>
        </Book>
    </Books>
</Catalog>

 

Поиск всех книг:

import xml.etree.cElementTree as ET
tree = ET.parse('sample.xml')
tree.findall('Books/Book')

 

Поиск книги с названием «Цвет магии»:

tree.find("Books/Book[Title='The Colour of Magic']") 
# всегда используйте '' в правой стороне сравнения

Поиск книги с id = 5:

tree.find("Books/Book[@id='5']")
# поиск с xml атрибутами должен иметь '@' перед именем
 

Поиск второй книги:

tree.find("Books/Book[2]")
# индексы начинаются с 1, не с 0

Поиск последней книги:

tree.find("Books/Book[last()]")
# 'last' единственная xpath функция позволенная в ElementTree

Поиск всех авторов:

tree.findall(".//Author")
# поиск с // должен использовать родственный путь