2017-12-19 16 views
1

したがって、私はKMLファイルからいくつかの地理データを抽出しようとしています。私が見ているすべてのことは、xmlstarletをbashで使うことができることを示唆しています。bash、2つのノードを抽出するxmlstarlet

<?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と少し処理の後、私は(単独行であることを先に変更された)サンプルデータの一部この(代表)からCSVファイルを取得しようとしています(OSX Sierra)次を使用して

、私は「GX:COORD」を抽出することができますノードが、同じことが(なぜ?)「と、」ノードには適用されません。

xmlstarlet sel -t -m '//gx:coord' -v . -n <in.kml > out.csv 

一緒に初歩的なピースにしようとした後に複数のsed反復を持つソリューションでは、一貫して、きれいに作業し、最良の結果を得るソリューション(xmlstarletを「when」と「gx:coord」データを生成するソリューションとして戻します... XLSTには慣れていません) 。これを実行するためのコマンドまたはステップに関する提案?ありがとう!

答えて

1

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 
関連する問題