извлечение Python XML для цикла - PullRequest
1 голос
/ 19 января 2012

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

Я извлекаю данные из файла 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 и время в порядке.

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

for x in trackpoint 

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

count = 0
n = len(trackpoint)
while count < n:
    print(time[count].firstChild.data)
    print(lat[count].firstChild.data)
    print(lon[count].firstChild.data)
    count += 1

У кого-нибудь есть идеи?Я думаю, что мне просто не хватает чего-то очень простого!

Ответы [ 3 ]

5 голосов
/ 19 января 2012

Сначала найдите все элементы Trackpoint и зациклите их. Затем внутри цикла найдите нужные элементы каждого элемента 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)
2 голосов
/ 19 января 2012

Я обычно находил синтаксический анализ 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

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

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 голосов
/ 19 января 2012

Возможно, вы ищете почтовый индекс :

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...