XML-Verarbeitung mit bash/sed am Beispiel von KML-Dateien für Google-Earth und Google-Maps

Seit vielen Jahren sammeln sich auf meinem Rechner GPX- und KML-Downloads von Radrouten aus allerlei Internet-Quellen wie digitalen-Büchern.

Typischerweise beinhalten diese Dateien abertausende Trackpunkte und sonstige Informationen, während für Anzeige in Google-Earth/-Maps wie Übertrag auf das Navigationsgerät lediglich das eigentliche Pfad-Polygon interessiert. Außerdem möchte ich z.B. bei E-Books der Art "Die 200 schönsten Flussradwege" gerne einen automatisch generierten Gesamtüberblick für Google-Earth/-Maps zur bequemen Vorauswahl mit geneigter Gemahlin auf dem Sofa, ohne für 200 Radwege erst alle Trackdaten in der Google-Earth-Darstellung nebst Ordnerstrukturen und unnötigen Informationen abhaken wie neu ordnen zu müssen (und dann gibt es ja noch "100 familienfreundliche Railtrails in Süddeutschland" oder die beste Ehefrau möchte doch nochmal schnell "33 Flussradwege für Genießer" überfliegen und welche der 5 zusammengesuchten Routenvarianten auf den Berg ist nun die für uns beste ? ... ähem, ja ...

Statt dieser Darstellung einer Einzeldatei ...



... mit oft Myriaden störender Wegpunkte, Unterordner und sonstiger Infos ...



hätten wir also gerne folgende Synopse aller Routen z.B. des Salzburger Landes ...



mit entsprechend erschöpfender Gesamt-Darstellung für die bestechend praktisch denkende bessere Hälfte



Anstatt nun jedoch das große Besteck mit Entwicklungsumgebung und XML-Parser auszupacken, genügen dem GNU/Linux-Minimalisten wie stets die Bordmittel, in diesem Fall

Der sed-Kern des ersten Scripts vearbeitet die XML-Struktur der (ggf. aus GPX gewandelten) übergebenen KML-Routendatei, aus deren tausenden Tags <Placemark></Placemark> jedoch nur dasjenige einzige mit einem Unter-Tag <name>Path</name> und darin wiederum die Daten des (andernorts ebenfalls vielfach vorkommenden) Tag-Paares <coordinates></coordinates> interessieren.

Um diese Struktur zur Laufzeit nicht einmal logisch zu erfassen, sondern lediglich zeilenweise zu verarbeiten, muss nun kein XML-Baum parsed und im Hauptspeicher aufgebaut werden; vielmehr genügt dem Puristen "simpel" serielle Text-Verarbeitung mit einem stream-line-editor, vulgo sed, über einen Bash-Einzeiler. Bereits ein awk-Script wäre mehr als Minimalismus gebietet. Da in sed keine Variablen verwendet werden können (und müssen), fungiert schlicht der hold-space als Platz für Flags/Merker, ob eine zu verarbeitende Zeile innerhalb der gewünschten Struktur liegt. Gleichzeitig wird die Verarbeitung frühestmöglich beendet, womit sich folgende sed-Logik (innerhalb einer einzigen Bash-Zeile) ergibt:



Um nun die Kerndaten aller so erzeugter Dateien *Pfad.kml zu einer Datei Gesamt.kml zusammenzufügen, genügt uns wiederum ein sed-Einzeiler innerhalb eines Bash-Wrappers, welcher das nun einzige Pfad-Tag einer jeden Datei <Placemark></Placemark> konkatenierend extrahiert ...



... und damit eine ehelich harmonische Tourenplanung auf dem Sofa sicherstellt.

Sollten sich innerhalb einer KML-Datei mehrere Koordinaten-Abschnitte innerhalb eines Pfades oder mehrere Pfade selbst befinden, müssen wir den sed-Aufruf anpassen zu ...



Die Scripte myroute2kmlpath (Verarbeitung je einer KML-/GPX-Datei) und myroute2kmlpathbatch (Batch-Wrapper für Ordern mit KML-/GPX-Dateien) finden sich im Downloadbereich.


Impressum und Datenschutzerklärung