簡體   English   中英

從 minidom/getElementsByTagName 到 lxml/xpath

[英]From minidom/getElementsByTagName to lxml/xpath

我正在嘗試解析許多不同的 xml/gpx 文件以獲取作為節點 trkpt 屬性的緯度/經度對。 我有一個工作的 minidom 版本,但我想嘗試使用 lxml 和 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>
'''

這是迷你版:

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)

Output:

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])

output 什么都不是,或者更確切地說,我的打印語句是錯誤的。 但我不知道,因為print(type(trkpt), len(trkpt), trkpt)的檢查告訴我: <class 'list'> 0 []所以列表從一開始就是空的。 有人可以幫我看看錯誤嗎?

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM