How to extract data from GPX file (and to parse gpx file)?
我正在Linux下使用bash进行编码。我正在尝试提取一系列gpx文件中的每个Rails的Rails名称和第一个时间戳。
我尝试使用以下命令(和其他变体)使用xmllint解析gpx文件:
1 2 | xmllint --xpath"//gpx/trk/name/text()" test.gpx xmllint --xpath"//gpx/trk/trkseg[1]/time/text()" test.gpx |
失败,并返回以下消息:
这是文件test.gpx
的示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <gpx creator="www.flyisfun.com" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" 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"> <trk> <name>Track_n1</name> <trkseg> <trkpt lat="-48.843895" lon="10.9835696"> <ele>126.75549</ele> <time>2016-04-16T11:05:00Z</time> </trkpt> <trkpt lat="-48.843254" lon="11.9823042"> <ele>126.90486</ele> <time>2016-04-16T11:05:05Z</time> </trkpt> </trkseg> </trk> </gpx> |
我期望得到这个测试用例
1 2 | Track_n1 2016-04-16T11:05:00Z |
我想知道为什么带有xmllint的命令不起作用,以及是否可以在不更改原始gpx文件的情况下将它们调整为起作用。
谢谢您的帮助。
如果您愿意使用xmllint的替代方法,那么xmlstarlet是一个不错的选择。 xmlstarlet中有很多命令,但是仅查询数据
我喜欢如何将名称空间绑定到前缀或将
将默认名称空间绑定到前缀...的示例...
1 | xmlstarlet sel -N g="http://www.topografix.com/GPX/1/1" -t -m"/g:gpx/g:trk" -v"g:name" -n -v"g:trkseg/g:trkpt[1]/g:time" -n test.gpx |
使用
1 | xmlstarlet sel -t -m"/_:gpx/_:trk" -v"_:name" -n -v"_:trkseg/_:trkpt[1]/_:time" -n test.gpx |
以上两个示例均产生以下输出...
1 2 | Track_n1 2016-04-16T11:05:00Z |
XML示例包含默认名称空间
将默认(空)命名空间更改为已知的命名空间:
1 2 3 | echo -e 'setns ns=http://www.topografix.com/GPX/1/1\ cat //ns:gpx/ns:trk/ns:name/text()' \\ | xmllint --shell test.xml | grep -Ev '^([/]| [-])' |
结果:
1 | Track_n1 |