#python #xml #parsing
#python #xml #синтаксический анализ
Вопрос:
Я пытаюсь создать CSV-файл с количеством транспортных средств на определенный момент времени из XML-файла.
<fcd-export xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/fcd_file.xsd">
<timestep time="0.00">
<vehicle id="veh0" x="668.78" y="2768.63" angle="265.68" type="veh_passenger" speed="0.00" pos="5.10" lane="253751722#0_1" slope="0.00"/>
</timestep>
<timestep time="1.00">
<vehicle id="veh0" x="666.91" y="2768.48" angle="265.68" type="veh_passenger" speed="1.88" pos="6.98" lane="253751722#0_1" slope="0.00"/>
</timestep>
<timestep time="2.00">
<vehicle id="veh0" x="663.10" y="2768.20" angle="265.68" type="veh_passenger" speed="3.82" pos="10.80" lane="253751722#0_1" slope="0.00"/>
</timestep>
<timestep time="3.00">
<vehicle id="veh0" x="656.86" y="2767.72" angle="265.68" type="veh_passenger" speed="6.25" pos="17.05" lane="253751722#0_1" slope="0.00"/>
</timestep>
<timestep time="4.00">
<vehicle id="veh0" x="648.85" y="2767.12" angle="265.68" type="veh_passenger" speed="8.04" pos="25.09" lane="253751722#0_1" slope="0.00"/>
</timestep>
<timestep time="5.00">
<vehicle id="veh0" x="639.02" y="2766.38" angle="265.68" type="veh_passenger" speed="9.85" pos="34.93" lane="253751722#0_1" slope="0.00"/>
</timestep>
<timestep time="14.00">
<vehicle id="veh0" x="619.10" y="2768.08" angle="85.68" type="veh_passenger" speed="8.01" pos="20.23" lane="-253751722#0_1" slope="0.00"/>
<vehicle id="veh1" x="988.73" y="2991.84" angle="226.12" type="veh_passenger" speed="3.87" pos="11.45" lane="-30968089#3_0" slope="0.00"/>
</timestep>
<timestep time="15.00">
<vehicle id="veh0" x="628.97" y="2768.83" angle="85.68" type="veh_passenger" speed="9.90" pos="30.13" lane="-253751722#0_1" slope="0.00"/>
<vehicle id="veh1" x="984.27" y="2987.44" angle="225.26" type="veh_passenger" speed="6.25" pos="17.70" lane="-30968089#3_0" slope="0.00"/>
</timestep>
<timestep time="16.00">
<vehicle id="veh0" x="640.26" y="2769.68" angle="85.68" type="veh_passenger" speed="11.32" pos="41.45" lane="-253751722#0_1" slope="0.00"/>
<vehicle id="veh1" x="978.85" y="2981.98" angle="224.80" type="veh_passenger" speed="7.69" pos="25.39" lane="-30968089#3_0" slope="0.00"/>
</timestep>
<timestep time="14.00">
<vehicle id="veh0" x="619.10" y="2768.08" angle="85.68" type="veh_passenger" speed="8.01" pos="20.23" lane="-253751722#0_1" slope="0.00"/>
<vehicle id="veh1" x="988.73" y="2991.84" angle="226.12" type="veh_passenger" speed="3.87" pos="11.45" lane="-30968089#3_0" slope="0.00"/>
</timestep>
<timestep time="15.00">
<vehicle id="veh0" x="628.97" y="2768.83" angle="85.68" type="veh_passenger" speed="9.90" pos="30.13" lane="-253751722#0_1" slope="0.00"/>
<vehicle id="veh1" x="984.27" y="2987.44" angle="225.26" type="veh_passenger" speed="6.25" pos="17.70" lane="-30968089#3_0" slope="0.00"/>
</timestep>
<timestep time="16.00">
<vehicle id="veh0" x="640.26" y="2769.68" angle="85.68" type="veh_passenger" speed="11.32" pos="41.45" lane="-253751722#0_1" slope="0.00"/>
<vehicle id="veh1" x="978.85" y="2981.98" angle="224.80" type="veh_passenger" speed="7.69" pos="25.39" lane="-30968089#3_0" slope="0.00"/>
</timestep>
Это то, что я сделал до сих пор:
import xml.etree.ElementTree as ET
xml_tree = ET.parse("trace.xml")
root = xml_tree.getroot()
while i<150:
print(root[i][1].get('id'))
i=i 1
Я попытался индексировать в теги, используя следующую команду: root[x][0].get('id')
Здесь x представляет время.
Но когда присутствует несколько тегов транспортных средств, он просто возвращает один из атрибутов.Я относительно новичок в python, и любая помощь будет оценена.Спасибо
Комментарии:
1. Можете ли вы опубликовать код, который вы сделали до сих пор?
2. Поместите код в вопрос, а не в комментарии. Вы можете отредактировать вопрос.
3. Извините, я новичок в этой платформе, я добавил код
4. Можете ли вы отредактировать свой вопрос и добавить в свой xml запись «при наличии нескольких тегов транспортных средств»? Кроме того, каков именно ваш ожидаемый результат?
5. Если вы посмотрите
<timestep time="15">
, вы можете найти `veh1` иveho
. На данный момент я просто пытаюсь получитьid
атрибут для каждого транспортного средства в определенный момент времени в качестве моего вывода.
Ответ №1:
Для такого типа заданий лучше использовать xpath с lxml:
from lxml import etree
vehicles = """[your xml]"""
doc = etree.XML(vehicles.encode())
for ts in doc.xpath('//timestep'):
print('time: ',ts.attrib['time'])
for vehicle in ts.xpath('./vehicle/@id'):
print('tvehicle id:',vehicle)
Вывод:
.....
time: 4.00
vehicle id: veh0
time: 5.00
vehicle id: veh0
time: 14.00
vehicle id: veh0
vehicle id: veh1
time: 15.00
vehicle id: veh0
vehicle id: veh1
.....