XML в Python

Содержание
Введение
root
Вложенные элементы
tag
Пример
Похожие статьи

Введение

В этой статье вы можете изучить примеры получения данных из xml файлов с помощью встроенной библиотеки xml

root и его атрибуты

Рассмотрим следующий .xml файл

<?xml version="1.0" encoding="utf-8" ?> <data version="1.3"> </data>

Получить значение version можно следующим скриптом

import xml.etree.ElementTree as ET print(ET.parse("demo.xml").getroot().attrib["version"])

1.3

Обычно под root принято выделять отдельный объект.

Название тега будет доступно как root.tag, а все аттрибуты как root.attrib

import xml.etree.ElementTree as ET tree = ET.parse("demo.xml") root = tree.getroot() print(root.tag) print(root.attrib)

data {'version': '1.3'}

Рассмотрим более сложный .xml файл

<?xml version="1.0" encoding="utf-8" ?> <sites version="1.4"> <projectInfo author="andreyolegovich.ru" client="heihei.ru"> <description>DevHops.ru</description> </projectInfo> <partners> <partner index="1" title="beget" id="5b2aa9d1"> </partner> <partner index="2" title="aviasales" id="a2934c0b"> </partner> </partners> <urls> <url id="1" text="www.beget.com" /> <url id="2" text="www.aviasales.ru" /> </urls> </sites>

Получить значение version можно тем же самым способом, что и в предыдущем примере.

import xml.etree.ElementTree as ET tree = ET.parse("demo.xml") root = tree.getroot() print(root.attrib["version"])

1.4

Переберем все подэлементы root

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

projectInfo {'author': 'andreyolegovich.ru', 'client': 'heihei.ru'} partners {} urls {}

Если нужно, к root можно применить len()

for i in range(len(root)): print(root[i].tag) print(root[i].attrib)

projectInfo {'author': 'andreyolegovich.ru', 'client': 'heihei.ru'} partners {} urls {}

Аналогичный результат можно получить с помощью list()

elements = list(root) for element in elements: print(element.tag)

projectInfo partners urls

Умение получать доступ к root и изучать его подэлементы пригодится нам в следующих частях статьи.

Вложенные теги

Достанем значения из вложенных тегов. Используем файл из предыдущего примера.

<?xml version="1.0" encoding="utf-8" ?> <sites version="1.4"> <projectInfo author="andreyolegovich.ru" client="heihei.ru"> <description>DevHops.ru</description> </projectInfo> <partners> <partner index="1" title="beget" id="5b2aa9d1"> </partner> <partner index="2" title="aviasales" id="a2934c0b"> </partner> </partners> <urls> <url id="1" text="www.beget.com" /> <url id="2" text="www.aviasales.ru" /> </urls> </sites>

Получим значения из разных полей файла

import xml.etree.ElementTree as ET tree = ET.parse("demo.xml") root = tree.getroot() project_info = root[0] partners = root[1] urls = root[2] print(project_info.attrib["author"]) print(project_info.find("description").text) for partner in partners: print(partner.attrib["title"]) for url in urls: print(url.attrib["text"])

andreyolegovich.ru DevHops.ru beget aviasales www.beget.com www.aviasales.ru

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

Пример

Рассмотрим следующий .xml файл

<?xml version="1.0" encoding="utf-8" ?> <voyage xmlns="http://www.aredel.com/voyage/1/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.3"> <voyageInfo voyageCode="ABC 12" voyageVersion="777" voyageName="RIGA - Malaga" type="voyage" vesselVoyage="urn:mrn:stm:voyage:id:aredel:123" creationTime="2025-08-19T10:29:28.000Z" lastUpdateTime="2025-08-19T15:26:55.089Z"> <description></description> </voyageInfo> <passages> <passage index="1" draft_m="3" title="" id="5b2aa9d1-a293-4c0b-898a-a4de78888888"> <route index="1" source="automatic" title="RIGA - MALAG" routeId="urn:mrn:aredel:route:id:6c8d0e87-368d-403c-9c13-888888888888" /> <departurePort portName="RIGA" type="port" locode="RIGAL" portId="1234" lat="00.000000000000000" lon="-1.111111111111111" etd="2025-08-19T15:22:05.000Z"> <navigationPoint index="0" name="" type="route_point" lat="40.611820999999999" lon="-74.045957000000001" /> </departurePort> <arrivalPort portName="Malaga" type="port" locode="MALAG" portId="99964" lat="26.082056000000001" lon="-77.535398999999998" eta="2025-08-23T03:37:47.000Z"> <navigationPoint index="0" name="" type="route_point" lat="26.072807000000001" lon="-77.542655999999994" /> </arrivalPort> </passage> </passages> <lockedChannels> <channel id="5484" airId="tag:igs.aredel.com,2017:prohibited-areas/mrgid/4317" /> <channel id="5498" airId="tag:igs.aredel.com,2017:prohibited-areas/aredel-code/COR" /> <channel id="5538" airId="tag:igs.aredel.com,2017:prohibited-areas/mrgid/18556" /> <channel id="5539" airId="tag:igs.aredel.com,2017:prohibited-areas/aredel-code/CRO" /> <channel id="5541" airId="tag:igs.aredel.com,2017:prohibited-areas/mrgid/4286" /> <channel id="1010547" airId="tag:igs.aredel.com,2021:shortcuts/RUTSTWNR" /> <channel id="1010794" airId="tag:igs.aredel.com,2021:shortcuts/RUTNTWNR" /> <channel id="1013836" airId="tag:igs.aredel.com,2021:shortcuts/RUTWTWNR" /> <channel id="1028458" airId="tag:igs.aredel.com,2017:prohibited-areas/aredel-code/EMS" /> <channel id="2002007" airId="tag:igs.aredel.com,2017:prohibited-areas/aredel-code/AIA" /> <channel id="2002008" airId="tag:igs.aredel.com,2017:prohibited-areas/aredel-code/AIH" /> <channel id="2002022" airId="tag:igs.aredel.com,2017:prohibited-areas/aredel-code/NVL" /> </lockedChannels> </voyage>

Получить locode порта отправления можно следующим образом:

import os import xml.etree.ElementTree as ET path_to_xml = os.path.join(os.path.dirname(__file__), "data.xml") def get_departure_port(): tree = ET.parse(path_to_xml) root = tree.getroot() passages = root[1] first_passage = passages[0] departure_port = first_passage[1] return departure_port.attrib["locode"] if __name__ == '__main__': print(get_departure_port())

python main.py

RIGAL

Автор статьи: Андрей Олегович

Похожие статьи
Работа с файлами в Python
Python
Основы работы с файлами
Продвинутые приёмы
glob: Работа с несколькими файлами
shutil: Работа с несколькими файлами
os
pathlib
Скачать файл по сети
.yaml.json
psutil: cистемные ресурсы
Обучение программированию на Python

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: