bash,xmlstarlet提取两个节点
bash, xmlstarlet to extract two nodes
所以,我正在尝试从 KML 文件中提取一些地理数据。我所看到的一切都表明我可以在 bash 中使用 xmlstarlet。我正在尝试从样本数据的这个(代表性)部分获取 CSV 文件(之前修改为单行):
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>
<Placemark>
<open>1</open>
<gx:Track>
<altitudeMode>clampToGround</altitudeMode>
<when>2015-12-24T18:20:57Z</when>
<gx:coord>-87.2788204 36.5984675 0</gx:coord>
<when>2015-12-24T18:20:42Z</when>
<gx:coord>-87.2784049 36.597298699999996 0</gx:coord>
</gx:Track>
</Placemark>
</Document>
</kml>
上面写着:
2015-12-24 18:20:57 -87.2788204 36.5984675 0
2015-12-24 18:20:42 -87.2784049 36.597298699999996 0
使用 sed (OSX Sierra) 进行一些处理后。
使用以下内容,我可以提取 "gx:coord" 节点,但同样不适用于 "when" 节点(为什么?):
xmlstarlet sel -t -m '//gx:coord' -v . -n <in.kml > out.csv
在尝试将基本解决方案与多个 sed 迭代拼凑在一起之后,我回到了这个解决方案,它可以始终如一、干净地工作并产生最佳结果(xmlstarlet 产生 "when" 和 "gx:coord" 数据...我不熟悉 XLST)。有关实现此目标的命令或步骤的建议?谢谢!
这是因为 when
在默认命名空间 http://www.opengis.net/kml/2.2
中。
尝试将前缀绑定到命名空间(使用 -N
)。
示例...
xmlstarlet sel -N kml='http://www.opengis.net/kml/2.2' -t -m '//gx:coord' -v "concat(preceding-sibling::kml:when[1],' ',.)" -n in.kml
输出...
2015-12-24T18:20:57Z -87.2788204 36.5984675 0
2015-12-24T18:20:42Z -87.2784049 36.597298699999996 0
我刚刚注意到您也在尝试对 when
进行一些字符串操作。它在命令行上可能会变得丑陋,所以我更喜欢 XSLT,但这里有一个选项...
xmlstarlet sel -N kml='http://www.opengis.net/kml/2.2' -t -m '//gx:coord' -v "concat(translate(preceding-sibling::kml:when[1],'TZ',' '),.)" -n in.kml
输出...
2015-12-24 18:20:57 -87.2788204 36.5984675 0
2015-12-24 18:20:42 -87.2784049 36.597298699999996 0
所以,我正在尝试从 KML 文件中提取一些地理数据。我所看到的一切都表明我可以在 bash 中使用 xmlstarlet。我正在尝试从样本数据的这个(代表性)部分获取 CSV 文件(之前修改为单行):
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>
<Placemark>
<open>1</open>
<gx:Track>
<altitudeMode>clampToGround</altitudeMode>
<when>2015-12-24T18:20:57Z</when>
<gx:coord>-87.2788204 36.5984675 0</gx:coord>
<when>2015-12-24T18:20:42Z</when>
<gx:coord>-87.2784049 36.597298699999996 0</gx:coord>
</gx:Track>
</Placemark>
</Document>
</kml>
上面写着:
2015-12-24 18:20:57 -87.2788204 36.5984675 0
2015-12-24 18:20:42 -87.2784049 36.597298699999996 0
使用 sed (OSX Sierra) 进行一些处理后。
使用以下内容,我可以提取 "gx:coord" 节点,但同样不适用于 "when" 节点(为什么?):
xmlstarlet sel -t -m '//gx:coord' -v . -n <in.kml > out.csv
在尝试将基本解决方案与多个 sed 迭代拼凑在一起之后,我回到了这个解决方案,它可以始终如一、干净地工作并产生最佳结果(xmlstarlet 产生 "when" 和 "gx:coord" 数据...我不熟悉 XLST)。有关实现此目标的命令或步骤的建议?谢谢!
这是因为 when
在默认命名空间 http://www.opengis.net/kml/2.2
中。
尝试将前缀绑定到命名空间(使用 -N
)。
示例...
xmlstarlet sel -N kml='http://www.opengis.net/kml/2.2' -t -m '//gx:coord' -v "concat(preceding-sibling::kml:when[1],' ',.)" -n in.kml
输出...
2015-12-24T18:20:57Z -87.2788204 36.5984675 0
2015-12-24T18:20:42Z -87.2784049 36.597298699999996 0
我刚刚注意到您也在尝试对 when
进行一些字符串操作。它在命令行上可能会变得丑陋,所以我更喜欢 XSLT,但这里有一个选项...
xmlstarlet sel -N kml='http://www.opengis.net/kml/2.2' -t -m '//gx:coord' -v "concat(translate(preceding-sibling::kml:when[1],'TZ',' '),.)" -n in.kml
输出...
2015-12-24 18:20:57 -87.2788204 36.5984675 0
2015-12-24 18:20:42 -87.2784049 36.597298699999996 0