我正在Linux下用bash编写代码。我试图提取的轨道名称和每个轨道的第一个时间戳在一系列的gpx文件。
我尝试用以下命令(和其他变体)使用xmllint解析gpx文件:
xmllint --xpath "//gpx/trk/name/text()" test.gpx
xmllint --xpath "//gpx/trk/trkseg[1]/time/text()" test.gpx它失败了,返回消息:XPath set is empty
下面是文件test.gpx的一个示例
<?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>我本来以为这个测试用例
Track_n1
2016-04-16T11:05:00Z我想知道为什么使用xmllint的命令不能工作,以及我是否可以在不改变原始gpx文件的情况下调整它们。
谢谢你的帮助。
发布于 2018-07-20 18:42:55
如果您愿意使用xmllint的替代方案,那么小星是一个很好的选择。在xmlstarlet中有相当多的命令,但是仅用于查询数据,(选择)就可以了。
我喜欢您如何将名称空间绑定到前缀或使用_作为默认名称空间的前缀(在1.5.0+版本中)。请看这里的更多细节。,与管道回显相比,我更喜欢这一点。
将默认命名空间绑定到前缀的示例。
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使用_作为默认命名空间的前缀的示例.
xmlstarlet sel -t -m "/_:gpx/_:trk" -v "_:name" -n -v "_:trkseg/_:trkpt[1]/_:time" -n test.gpx以上两个例子都产生了以下输出..。
Track_n1
2016-04-16T11:05:00Z发布于 2018-07-20 00:34:38
XML示例包含默认名称空间xmlns="http://www.topografix.com/GPX/1/1"。可以使用xmllint --shell和setns相结合来获取值。
将默认(空)命名空间更改为已知名称空间:
echo -e 'setns ns=http://www.topografix.com/GPX/1/1\ncat //ns:gpx/ns:trk/ns:name/text()' \
| xmllint --shell test.xml | grep -Ev '^([/]| [-])'结果:
Track_n1xpath函数也可以使用,但有时很难读取复杂的local-name()表达式。
发布于 2021-06-05 17:38:02
我已经设法将我的Garmin转换成文本格式,从这里给出的解决方案。以下是一些有用的语法:
xmlstarlet sel -N g="http://www.topografix.com/GPX/1/1" -T -t -m "/g:gpx/g:trk/g:trkseg/g:trkpt" -v "@lat" -o "|" -v "@lon" -o "|" -v "g:ele" -o "|" -v "g:time" -n my_track.gpx
xmlstarlet sel -N g="http://www.topografix.com/GPX/1/1" -T -t -m "/g:gpx/g:trk/g:trkseg/g:trkpt" -v "concat(@lat,'|',@lon,'|',g:ele,'|',g:time)" -n my_track.gpx
xmlstarlet sel -T -t -m "/_:gpx/_:trk/_:trkseg/_:trkpt" -v "concat(@lat,'|',@lon,'|',_:ele,'|',_:time)" -n my_track.gpx
xmlstarlet select --text --template --match "/_:gpx/_:trk/_:trkseg/_:trkpt" --value-of "concat(@lat,'|',@lon,'|',_:ele,'|',_:time)" --nl my_track.gpxhttps://stackoverflow.com/questions/51433114
复制相似问题