【问题标题】:Read GPX using lxml and xpath使用 lxml 和 xpath 读取 GPX
【发布时间】:2016-10-24 04:35:15
【问题描述】:

通过这个post,我知道我可以通过.find().findall().text() 来获取嵌套在标签中的值。

以下面的.gpx文件为例,

<?xml version="1.0"?>
<gpx version="1.1" creator="Trails 1.28 - https://www.trails.io" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxtpx="http://www8.garmin.com/xmlschemas/TrackPointExtensionv2.xsd" xmlns:trailsio="http://trails.io/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://trails.io/GPX/1/0 https://trails.io/GPX/1/0/trails_1.0.xsd">
    <metadata>
        <time>2016-03-27T06:30:06Z</time>
    </metadata>
    <trk>
        <name><![CDATA[xyz]]></name>
        <extensions><trailsio:TrackExtension><trailsio:activity>trekking</trailsio:activity></trailsio:TrackExtension></extensions>
        <trkseg>
            <trkpt lat="22.491121" lon="114.137634">
                <ele>41.270</ele>
                <time>2016-03-27T01:21:21Z</time>
            </trkpt>
            <trkpt lat="22.491104" lon="114.137612">
                <ele>42.777</ele>
                <time>2016-03-27T01:21:38Z</time>
            </trkpt>
        </trkseg>
    </trk>
</gpx>

如果我想获取海拔,我可以试试:

gpx = etree.parse("D:/Users/perry/Downloads/abc.gpx")
ele = gpx.findall("{http://www.topografix.com/GPX/1/1}trk")
ele = [x.findall("{http://www.topografix.com/GPX/1/1}trkseg") for x in ele][0]
ele = [x.findall("{http://www.topografix.com/GPX/1/1}trkpt") for x in ele][0]
ele = [x.findall("{http://www.topografix.com/GPX/1/1}ele") for x in ele]
[x[0].text for x in ele]

输出是['41.270', '42.777'],这就是我想要的!太好了!

但是,我想使用.xpath(),但是

gpx.xpath("//ele")

,

gpx.xpath("//{http://www.topografix.com/GPX/1/1}ele")

gpx.xpath("//ele", namespaces = {'ele': "http://www.topografix.com/GPX/1/1"})

要么返回[],要么返回错误“lxml.etree.XPathEvalError: Invalid expression”。

如何使用.xpath() 获取海拔?

谢谢!

【问题讨论】:

    标签: python xml xpath lxml gpx


    【解决方案1】:

    你在正确的轨道上:

    gpx.xpath("//ele", namespaces = {'ele': "http://www.topografix.com/GPX/1/1"})
    

    因为 XML 中有一个默认命名空间,所以 XPath //ele 本身不会在 http://www.topografix.com/GPX/1/1 命名空间中找到 ele 元素。

    因此有必要向 XPath 提供程序注册一个前缀,您已经这样做了。但是,您需要使用它的注册前缀来引用该元素。所以以下将起作用:

    gpx.xpath("//gpx:ele", namespaces = {'gpx': "http://www.topografix.com/GPX/1/1"})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2016-06-23
      • 2013-08-06
      • 2018-01-02
      • 1970-01-01
      • 2017-03-29
      • 2012-08-23
      相关资源
      最近更新 更多