От minidom / getElementsByTagName до lxml / xpath - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь проанализировать множество различных файлов xml / gpx, чтобы получить пары lat / lon, которые являются атрибутом узла trkpt. У меня есть рабочая версия minidom, но я хочу попробовать подобную версию, используя l xml и xpath, чтобы проверить, быстрее ли она.

Вот пример xml:

xml = '''<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" xmlns="http://www.topografix.com/GPX/1/1">
 <metadata>
  <time>2015-12-24T12:00:00Z</time>
 </metadata>
 <trk>
  <name>Track 1</name>
  <trkseg>
   <trkpt lat="42.00080" lon="2.79610">
    <ele>39.5</ele>
    <time>2015-12-24T12:00:00Z</time>
   </trkpt>
   <trkpt lat="42.99930" lon="2.79010">
    <ele>39.5</ele>
    <time>2015-12-24T12:01:00Z</time>
   </trkpt>
  </trkseg>
 </trk>
</gpx>
'''

Это версия minidom:

from xml.dom import minidom
minitree = minidom.parseString(xml)
trkpt = minitree.getElementsByTagName('trkpt')

for elem in trkpt:
    print(elem.attributes['lat'].value + ', ' + elem.attributes['lon'].value)

Вывод:

42.00080, 2.79610
42.99930, 2.79010

Теперь пытаюсь повторить ту же самую вещь, которую я использовал XMLQuire, чтобы узнать, что xpath для моих желаемых атрибутов будет быть dft:trk/dft:trkseg/dft:trkpt/@lat так что я придумал это до сих пор:

lxtree = etree.fromstring(xml)
trkpt = lxtree.xpath('dft:trk/dft:trkseg/dft:trkpt', namespaces={'dft': 'http://www.topografix.com/GPX/1/1'})

for elem in trkpt:
    print(trkpt[@lat] + ', ' + trpkt[@lon])

Вывод - ничто или, скорее, мое утверждение печати неверно. Но я не могу сказать, потому что проверка с print(type(trkpt), len(trkpt), trkpt) говорит мне: <class 'list'> 0 [] Таким образом, список пуст от get go. Может кто-нибудь помочь мне увидеть ошибку?

1 Ответ

1 голос
/ 11 апреля 2020

Используйте elem.get(), чтобы получить значение атрибута.

lxtree = etree.fromstring(xml)
trkpt = lxtree.xpath('dft:trk/dft:trkseg/dft:trkpt', namespaces={'dft': 'http://www.topografix.com/GPX/1/1'})

for elem in trkpt:
    print(elem.get("lat") + ', ' + elem.get("lon"))

Результат:

42.00080, 2.79610
42.99930, 2.79010
...