python - 使用lxml和xpath读取GPX

标签 python xml xpath lxml gpx

从此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:无效表达式”。

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

谢谢!

最佳答案

您的方向是正确的:

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

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

因此,有必要向 XPath 提供程序注册一个前缀,您已完成此操作。但是,您随后需要使用其注册的前缀来引用该元素。因此,以下内容将起作用:

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

关于python - 使用lxml和xpath读取GPX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37964570/

相关文章:

python - 有没有办法更改日志文件中运行的关键字的颜色,即使该关键字成功?

python - EOL 字符串文字使用 webdriver selenium 创建保存位置

xml - 将选项卡式文本转换为 Perl 数据格式

xml - 如何通过 XPath 访问具有多个命名空间的 XML 中的元素?

python - 我的 pygame 项目不断出现属性错误,我不明白为什么

python - 合并 Json 响应 Django python

xml - Node SOAP XML 语法

java - DocumentBuilder.parse(InputStream) 返回 null

c# - 在 xpath 表达式中使用字符串文字是不好的做法吗?

python - 在 python 中通过 xpath 在 html 中导航