2012-01-18 3 views
1

У меня есть немного скрипта, который, я думаю, почти у вас. Я разработал грубый способ записи, но я не могу понять, как заставить его функционировать как цикл for.python xml extract for loop

я извлечение данных из файла XML, который использует следующий формат:

<Trackpoint> 
    <Time>2012-01-17T11:44:35Z</Time> 
    <Position> 
     <LatitudeDegrees>51.920211518183351</LatitudeDegrees> 
     <LongitudeDegrees>26.706042898818851</LongitudeDegrees> 
    </Position> 
    <AltitudeMeters>-43.6026611328125</AltitudeMeters> 
</Trackpoint> 
<Trackpoint> 
    <Time>2012-01-17T11:45:21Z</Time> 
    <Position> 
     <LatitudeDegrees>51.920243117958307</LatitudeDegrees> 
     <LongitudeDegrees>26.706140967085958</LongitudeDegrees> 
    </Position> 
    <AltitudeMeters>-43.6026611328125</AltitudeMeters> 
</Trackpoint> 

я могу использовать следующее, чтобы получить говорю LatitudeDegrees:

from xml.dom.minidom import parse 
doc = parse('/Users/name/Documents/GPS/gps.tcx') 
lat = doc.getElementsByTagName("LatitudeDegrees") 
time = doc.getElementsByTagName("Time") 
trackpoint = doc.getElementsByTagName("Trackpoint") 

for x in lat: 
    print(x.firstChild.data) 

, но я хотел бы получить Lat, Long и время в порядке.

Я предполагаю, что мне нужно использовать

for x in trackpoint 

но единственный способ, которым я могу работать, как сделать это следующим образом.

У кого-нибудь есть идеи? Кажется, я просто пропустил что-то очень простое!

ответ

5

Сначала найдите все элементы Trackpoint и переверните их. Затем в цикле найти разыскиваемое childelements каждого Trackpoint элемента:

from xml.dom.minidom import parse 

doc = parse('in.tcx') 

trackpoints = doc.getElementsByTagName("Trackpoint") 
result = [] 
elements = ('Time', 'LatitudeDegrees', 'LongitudeDegrees') 
for tp in trackpoints: 
    obj = {} 
    for el in elements: 
     obj[el] = tp.getElementsByTagName(el)[0].firstChild.data 
    result.append(obj) 


print(result) 
+0

является результатом список и OBJ словарь? – beoliver

+0

Да, это '[{'Time':, 'LatitudeDegrees':, 'LongitudeDegrees':}]' –

+0

@ user969617, конечным результатом является список словарей. Вы можете распечатать результат напрямую, изменив строку 'obj [el] ='. Но более гибко сохранять этот формат, а затем создавать отдельную функцию, которая выводит его. –

0

Возможно, вы ищете zip:

import xml.dom.minidom as minidom 
import os 

doc = minidom.parse(os.path.expanduser('~/test/gps.tcx')) 
latitudes = doc.getElementsByTagName("LatitudeDegrees") 
longitudes = doc.getElementsByTagName("LongitudeDegrees") 
time = doc.getElementsByTagName("Time") 
trackpoint = doc.getElementsByTagName("Trackpoint") 

for t,lat,lon in zip(time,latitudes,longitudes): 
    print(t.firstChild.data, lat.firstChild.data, lon.firstChild.data) 
+0

Если честно, я точно не знаю, что мне нужно. Я хочу, чтобы иметь возможность сохранить результат, а затем сравнить и объединить их с различными данными из .plist. Я читал об этом на почтовом индексе, поскольку он выглядит интересным. – beoliver

2

я обычно нашел разбор XML с помощью ElementTree более читаемой и легче, например, Вы можете прочитать широту в трех линиях

import xml.etree.ElementTree as etree 

s="""<root> 
<Trackpoint> 
    <Time>2012-01-17T11:44:35Z</Time> 
    <Position> 
     <LatitudeDegrees>51.920211518183351</LatitudeDegrees> 
     <LongitudeDegrees>26.706042898818851</LongitudeDegrees> 
    </Position> 
    <AltitudeMeters>-43.6026611328125</AltitudeMeters> 
</Trackpoint> 
<Trackpoint> 
    <Time>2012-01-17T11:45:21Z</Time> 
    <Position> 
     <LatitudeDegrees>51.920243117958307</LatitudeDegrees> 
     <LongitudeDegrees>26.706140967085958</LongitudeDegrees> 
    </Position> 
    <AltitudeMeters>-43.6026611328125</AltitudeMeters> 
</Trackpoint> 
</root> 
""" 

root = etree.fromstring(s) 
for point in root: 
    print point.find('Position/LatitudeDegrees').text 

так предположим, что вы хотите, чтобы преобразовать каждую точку в Словаре

varnames = [ 
    ('Position/LatitudeDegrees', 'lat'), 
    ('Position/LongitudeDegrees', 'lon'), 
    ('Time', 'time'), 
    ('AltitudeMeters', 'alt') 
    ] 

points = [] 
for pointelem in etree.fromstring(s): 
    point = {} 
    for tag, varname in varnames: 
     point[varname] = pointelem.find(tag).text 
    points.append(point) 

import pprint 
pprint.pprint(points) 

выход:

[{'alt': '-43.6026611328125', 
    'lat': '51.920211518183351', 
    'lon': '26.706042898818851', 
    'time': '2012-01-17T11:44:35Z'}, 
{'alt': '-43.6026611328125', 
    'lat': '51.920243117958307', 
    'lon': '26.706140967085958', 
    'time': '2012-01-17T11:45:21Z'}] 
+0

из файла я бы использовал 's =" /Users/name/Documents/GPS/gps.tcx "'? – beoliver

+0

@ user969617, если у вас есть файл, вы можете напрямую использовать etree.parse http://docs.python.org/library/xml.etree.elementtree.html#xml.etree.ElementTree.parse –