【问题标题】:From minidom/getElementsByTagName to lxml/xpath从 minidom/getElementsByTagName 到 lxml/xpath
【发布时间】:2020-07-24 02:51:45
【问题描述】:

我正在尝试解析许多不同的 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)

输出:

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) 的检查告诉我:&lt;class 'list'&gt; 0 [] 所以列表从一开始就是空的。有人可以帮我看看错误吗?

【问题讨论】:

    标签: python xpath lxml minidom


    【解决方案1】:

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

    【讨论】:

    • 啊,我把树弄糊涂了。非常感谢。
    猜你喜欢
    • 2017-03-06
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2012-09-29
    相关资源
    最近更新 更多