Найти в Дзене

Программирование на языке Python. Работа с xml форматом с помощью модуля xml.etree.ElementTree

Оглавление

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Модуль xml.etree.ElementTree для работы с xml-форматом

Я надеюсь, что читатель знаком с xml-форматом, хотя бы на некоторых простых примерах и поэтому я лишаю себя обязанности этот формат излагать. А вот непосредственно возможности стандартного модуля поддержки xml-формата я представлю здесь в статье.

Формирование xml-документа на python

Модуль xml.etree.ElementTree позволяет очень легко формировать xml-документ. Ниже представлена прокомментированная программа, создающая xml-документ. Документ выводится на консоль (dump()) и в файл example.xml (write()).

#!/usr/bin/python3

import xml.etree.ElementTree as xm

# создаём элемент xml-документа
ex = xm.Element('DocumentXML ').
# создаём вложенные элементы
ex1 = xm.SubElement(ex, 'Subdocument')
ex11 = xm.SubElement(ex, 'Subdocument2')
ex2 = xm.SubElement(ex1, 'Sub-subdocument')
# добавляем атрибуты к данному элементу
ex2.set('year', '1999')
ex2.set('month', 'June')
ex2.set('day', '24')
# задаём содержимое для данного элемента
ex2.text = 'Text'
# добавляем комментарий
com = xm.Comment("it's a simple XML")
ex.append(com)
# вывод xml-документа на консоль
xm.dump(ex)
# вывод xml-документа в файл
tr = xm.ElementTree(ex)
tr.write("example.xml")


В результате получаем файл xml

<DocumentXML ><Subdocument><Sub-subdocument year="1999" month="June" day="24">Text</Sub-subdocument></Subdocument><Subd
ocument2 /><!--it's a simple XML--></DocumentXML >

Напомню некоторые термины.

  • Тэги. Например <DocumentXML> и </DocumentXML> начальный и конечный тэги.
  • Элемент XML. Начальный и конечный тэги и всё, что между ними.
  • Атрибуты элемента. Например "day" - атрибут, "24" - значение атрибута.
  • Текст (содержимое) элемента. То что находится между начальным и конечным тэгом и не является элементом.

Редактирование и простое чтение xml-файлов на python

Будем исходить из файла example.xml, который был получен в предыдущем примере. Для считывания xml-файла используем метод parse(). Метод не только считывает но и разбирает xml-файл. По сути мы получим в общем случае вложенные списки элементов с возможностью просматривать и изменять их атрибуты, тексты, а также добавлять новые элементы.

#!/usr/bin/python3

import xml.etree.ElementTree as xm

tree = xm.parse('example.xml')
rt = tree.getroot() # корневой уровень
print(rt)
print(rt[0][0]) # Sub-subdocument
tx = rt[0][0].text # текст элемента Sub-subdocument
at = rt[0][0].attrib # атрибут элемента Sub-subdocument
print(tx)
print(at)
rt[0][0].text = 'Element' # изменим текст
rt.set('value', '123') # добавим атрибут
xm.SubElement(rt[1], 'Doc2') # добавляем подэлемент в Subdocument2
tree.write('example1.xml')


Вывод на консоль:

<Element 'DocumentXML' at 0x7fec9c5131d0>
<Element 'Sub-subdocument' at 0x7fec9c513270>
Text
{'year': '1999', 'month': 'June', 'day': '24'}

В результате получим также новый файл example1.xml

<DocumentXML value="123"><Subdocument><Sub-subdocument year="1999" month="June" day="24">Element</Sub-subdocument></Sub
document><Subdocument2><Doc2 /></Subdocument2></DocumentXML>

Замечание 1
Элемент
elem1 xml-структуры может быть удалён: elem.remove(elem1), где elem родительский элемент. Например rt.remove(rt[1]) в нашем примере.

Замечание 2
Представленный выше способ чтения xml-файла Пропускает комментарий. Так что в файле example1.xml комментария уже нет.

Перебор элементов xml в python

Возможен полный перебор элементов или перебор для данного элемента xml-файла.

Перебор всех элементов xml-файла. Текст программы см. по ссылке ниже
Перебор всех элементов xml-файла. Текст программы см. по ссылке ниже
primer254.py

Результат выполнения программы

Тэг:  Sub-subdocument
Атрибуты:  {'year': '1999', 'month': 'June', 'day': '11'}
Содержание Element
Тэг:  Subdocument
Атрибуты:  {}
Содержание None
Тэг:  Doc2
Атрибуты:  {}
Содержание None
Тэг:  Subdocument2
Атрибуты:  {}
Содержание None
Тэг:  DocumentXML
Атрибуты:  {'value': '123'}
Содержание None

Переменная event фиксирует событие: начало ('start') или конец ('end') элемента. В нашем случае только начало. Чтобы фиксировать начало и конец нужен цикл:

for event, elem in xm.iterparse("example1.xml", events=('start', 'end'))

Можно осуществлять поиск по тэгу или другим свойствам элемента и при необходимости что-то править.

Поиск нужного тэга и изменение одного атрибутов. Текст программы см. ниже по ссылке
Поиск нужного тэга и изменение одного атрибутов. Текст программы см. ниже по ссылке
primer255.py

Замечание 1
Изменение атрибута происходит по следующему алгоритму: если атрибут отсутствует, то он добавляется. Если атрибут есть, то его значение изменяется.

Замечание 2
Удалить элемент также можно методом
elem.clear()

Модуль xml.etree.ElementTree не единственный инструмент для работы с xml-форматом. Ну в одной из следующих статей вернусь к другим средствам.

Ну, пока всё!

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

К чему  это структура? Скажите по-русски, что вы хотите
К чему это структура? Скажите по-русски, что вы хотите