Мастерство парсинга XML в Python: практическое руководство с Minidom и ElementTree
Что такое XML?
XML (eXtensible Markup Language) создан для эффективного хранения и транспорта структурированных данных. Широко используется для обмена информацией между системами и приложениями.
Python предоставляет надёжные библиотеки для парсинга и манипуляции XML-документами. Однако для парсинга XML-файла весь документ сначала должен быть загружен в память. В этом туториале мы продемонстрируем, как использовать модули xml.dom.minidom и xml.etree.ElementTree для чтения, инспекции и модификации XML-файлов.
К концу руководства вы сможете:
- Парсить XML с
minidom - Создавать новые XML-узлы
- Парсить XML с
ElementTree
Парсинг XML с minidom
Начнём с примера XML-файла с данными сотрудников. Файл выглядит так:
Шаг 1) Файл перечисляет имя, фамилию, дом и области экспертизы сотрудника: SQL, Python, Testing, Business.

Шаг 2) После загрузки документа мы распечатаем nodeName корневого элемента и tagName его первого ребёнка. Это стандартные свойства DOM-объекта.

- Импортируйте
xml.dom.minidomи загрузите XML-файл (myxml.xml). - Распарсьте файл с
parse()для получения объекта документа. - Получите и отобразите
nodeNameдокумента иtagNameпервого ребёнка. - Используйте
getElementsByTagName()для списка всех элементовexpertiseи печати каждого навыка.
Примечание: Значения nodeName и tagName следуют соглашениям именования XML DOM, которые могут быть незнакомы новичкам в XML.
Шаг 3) Мы можем извлечь список всех навыков из документа. Следующий код демонстрирует сбор имён навыков в множество.

- Используйте
getElementsByTagName("skill")для получения всех элементов skill. - Итерируйте по возвращённому списку и выводите атрибут
nameкаждого навыка.
Создание нового XML-узла
Добавление новых данных в существующую XML-структуру просто с minidom. В примере добавим новый узел expertise с меткой «BigData».
- Создайте новый элемент с
createElement("expertise")и установите атрибутname. - Присоедините новый элемент к первому ребёнку документа.

- После вставки список
expertiseтеперь включает новый навык «BigData».
Пример XML Parser
Пример для Python 2
import xml.dom.minidom
def main():
# Загрузить и распарсить XML-файл
doc = xml.dom.minidom.parse("Myxml.xml")
# Вывести информацию о корне
print doc.nodeName
print doc.firstChild.tagName
# Список существующих записей expertise
expertise = doc.getElementsByTagName("expertise")
print "%d expertise:" % expertise.length
for skill in expertise:
print skill.getAttribute("name")
# Добавить новую запись expertise
newexpertise = doc.createElement("expertise")
newexpertise.setAttribute("name", "BigData")
doc.firstChild.appendChild(newexpertise)
print " "
# Проверить добавление
expertise = doc.getElementsByTagName("expertise")
print "%d expertise:" % expertise.length
for skill in expertise:
print skill.getAttribute("name")
if __name__ == "__main__":
main()
Пример для Python 3
import xml.dom.minidom
def main():
# Загрузить и распарсить XML-файл
doc = xml.dom.minidom.parse("Myxml.xml")
# Вывести информацию о корне
print(doc.nodeName)
print(doc.firstChild.tagName)
# Список существующих записей expertise
expertise = doc.getElementsByTagName("expertise")
print("%d expertise:" % expertise.length)
for skill in expertise:
print(skill.getAttribute("name"))
# Добавить новую запись expertise
newexpertise = doc.createElement("expertise")
newexpertise.setAttribute("name", "BigData")
doc.firstChild.appendChild(newexpertise)
print(" ")
# Проверить добавление
expertise = doc.getElementsByTagName("expertise")
print("%d expertise:" % expertise.length)
for skill in expertise:
print(skill.getAttribute("name"))
if __name__ == "__main__":
main()
Парсинг XML с ElementTree
ElementTree — лёгкий API, делающий манипуляции с XML простыми и питоничными. Идеален для чтения больших XML-файлов без накладных расходов полного DOM.
Наш пример XML-данных:
<data>
<items>
<item name="expertise1">SQL</item>
<item name="expertise2">Python</item>
</items>
</data>
Чтение XML с ElementTree:
Сначала импортируйте модуль:
import xml.etree.ElementTree as ET
Распарсьте файл и получите корневой элемент:
tree = ET.parse('items.xml')
root = tree.getroot()
Полный код для отображения всех имён навыков:
import xml.etree.ElementTree as ET
tree = ET.parse('items.xml')
root = tree.getroot()
print('Expertise Data:')
for elem in root:
for subelem in elem:
print(subelem.text)
Вывод:
Expertise Data: SQL Python
Резюме
Модули Python xml.dom.minidom и xml.etree.ElementTree позволяют разработчикам эффективно загружать, анализировать и модифицировать XML-документы. Пока minidom предоставляет полное DOM-представление, подходящее для сложных манипуляций, ElementTree предлагает лёгкую альтернативу для прямого парсинга и извлечения.
- Загрузите XML с
parse()(например,doc = xml.dom.minidom.parse(file)). - Используйте
getElementsByTagName()для получения элементов. - Создавайте и присоединяйте новые узлы с
createElement()иappendChild(). - С ElementTree просто итерируйте по дочерним элементам для доступа к данным.
Python
- Работа с файлами в Python: открытие, чтение, запись и управление
- Чтение файлов в Java с BufferedReader — Практическое руководство с примерами
- Мастерство метода strip() в Python: подробное руководство и практические примеры
- Python len(): практическое руководство по измерению длины объектов
- Освоение yield в Python: генератор против return — практическое руководство
- Counter в collections Python: эффективное подсчёт, обновление и арифметические операции
- Освоение enumerate() в Python: циклы с индексами для списков, кортежей, строк и словарей
- Проверка существования файлов и директорий в Python — практическое руководство
- Python JSON: кодирование, декодирование и работа с файлами — практическое руководство
- Python list.index(): как находить позиции элементов — практические примеры