从 minidom/getElementsByTagName 到 lxml/xpath
From minidom/getElementsByTagName to lxml/xpath
我正在尝试解析许多不同的 xml/gpx 文件以获得作为节点 trkpt 属性的 lat/lon 对。我有一个可用的 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)
输出:
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 []
所以列表从一开始就是空的。有人可以帮我看看错误吗?
使用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
我正在尝试解析许多不同的 xml/gpx 文件以获得作为节点 trkpt 属性的 lat/lon 对。我有一个可用的 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)
输出:
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 []
所以列表从一开始就是空的。有人可以帮我看看错误吗?
使用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