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
Пример
Рассмотрим следующий .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
Автор статьи: Андрей Олегович