使用lxml和xpath读取GPX

2024-10-01 13:43:35 发布

您现在位置:Python中文网/ 问答频道 /正文

从这个post,我知道我可以.find().findall()和{}来获得嵌套在标记中的值。在

以下面的.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>

如果我想获得高程,我可以尝试:

^{pr2}$

输出是['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.xpathValeror:表达式“”无效。在

如何使用.xpath()获取标高?在

谢谢你!在


Tags: iocomhttptimewwwgpxxpathxsd
1条回答
网友
1楼 · 发布于 2024-10-01 13:43:35

您在正确的轨道上:

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

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

因此,有必要向XPath提供程序注册前缀,这是您已经完成的。但是,您需要使用元素的注册前缀来引用它。因此,以下方法将起作用:

^{pr2}$

相关问题 更多 >