2017-12-19 8 views
1

Also, ich versuche, einige Geodaten aus einer KML-Datei zu extrahieren. Alles, was ich sehe, deutet darauf hin, dass ich xmlstarlet in bash verwenden könnte. Ich versuche, eine CSV-Datei aus diesem (Vertreter) Teil der Beispieldaten zu erhalten (modifizierte früher einzelne Zeile zu sein):bash, xmlstarlet, um zwei Knoten zu extrahieren

<?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> 

, der liest:

2015-12-24 18:20:57 -87.2788204 36.5984675 0 
2015-12-24 18:20:42 -87.2784049 36.597298699999996 0 

Nach einer kleinen Verarbeitung mit sed (OSX Sierra).

die folgende Verwendung, kann ich das „gx: Koor“ extrahieren Knoten, aber das gleiche mit dem „wann“ Knoten nicht anwendbar ist (warum?):

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

Nach dem Versuch, zusammen rudimentär Stück Lösungen mit mehreren sed-Iterationen, ich bin zurück darauf als die Lösung, die konsistent, sauber arbeiten und das beste Ergebnis liefern würde (xmlstarlet, um die "wann" - und "gx: coord" -Daten zu liefern ... Ich bin mit XLST nicht vertraut) . Vorschläge für den Befehl oder Schritte, um dies zu erreichen? Vielen Dank!

Antwort

1

Es ist, weil when im Standardnamespace http://www.opengis.net/kml/2.2 ist.

Versuchen Sie, ein Präfix an den Namespace zu binden (mit -N).

Beispiel ...

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 

Ausgang ...

2015-12-24T18:20:57Z -87.2788204 36.5984675 0 
2015-12-24T18:20:42Z -87.2784049 36.597298699999996 0 

Ich habe gerade bemerkt, dass Sie auch einige String-Manipulation auf when zu tun versuchen. Es kann auf der Kommandozeile hässlich, also würde ich XSLT bevorzugen, aber hier ist eine Option ...

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 

Ausgang ...

2015-12-24 18:20:57 -87.2788204 36.5984675 0 
2015-12-24 18:20:42 -87.2784049 36.597298699999996 0 
Verwandte Themen