Доброго времени суток, читатели, зрители моего канала 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-файла.
Результат выполнения программы
Тэг: 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'))
Можно осуществлять поиск по тэгу или другим свойствам элемента и при необходимости что-то править.
Замечание 1
Изменение атрибута происходит по следующему алгоритму: если атрибут отсутствует, то он добавляется. Если атрибут есть, то его значение изменяется.
Замечание 2
Удалить элемент также можно методом elem.clear()
Модуль xml.etree.ElementTree не единственный инструмент для работы с xml-форматом. Ну в одной из следующих статей вернусь к другим средствам.
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.