Gelegentlich sollen die in einem Metadateninformationssystem (GeoMIS) erfassten ISO-19139-Metadaten automatisch aktualisiert werden. Dies kann beispielsweise der Fall sein, wenn sich der Name eines Datenanbieters („Organisationsname“) ändert.
Diese Aufgabe kann einfach und kosteneffizient mit dem Open Source Kommandozeilenwerkzeug XMLStarlet gelöst werden. XMLStarlet ermöglicht die Abfrage, Aktualisierung und Validierung von XML-Dokumenten.
Installation
Unter Debian-Linux kann das Kommandozeilenwerkzeug mit dem Advance Package Tool (APT) installiert werden.
$ sudo apt-get install xmlstarlet
Hinweis: Die folgenden Beispiele wurden unter Debian Wheezy (Linux) erarbeitet. Nutzern von Microsoft Windows steht alternativ ein Download auf der XMLStarlet-Homepage zur Verfügung.
Aktualisierung eines Metadatensatzes
Für die Aktualisierung der Metadaten sind zunächst die XPath-Ausdrücke der Elemente organisationName
und dateStamp
zu ermitteln. Eine Aufstellung aller in einem XML-Dokument vorhandener Elemente kann über das XMLStarlet Unterkommando elements
erstellt werden. Für jedes Element wird der absolute XPath-Ausdruck ausgegeben.
$ xmlstarlet elements 40f7b25c-3a78-30e8-a6fd-e0a24b818b63.xml
Ergebnis (Auszug Zeile 1-10 von 336):
gmd:MD_Metadata gmd:MD_Metadata/gmd:language gmd:MD_Metadata/gmd:language/gmd:LanguageCode gmd:MD_Metadata/gmd:characterSet gmd:MD_Metadata/gmd:characterSet/gmd:MD_CharacterSetCode gmd:MD_Metadata/gmd:hierarchyLevel gmd:MD_Metadata/gmd:hierarchyLevel/gmd:MD_ScopeCode gmd:MD_Metadata/gmd:hierarchyLevelName gmd:MD_Metadata/gmd:hierarchyLevelName/gco:CharacterString gmd:MD_Metadata/gmd:contact [...]
Für die Aktualisierung des Organisationsnamens wird ein relativer XPath-Ausdruck verwendet. Hierdurch werden alle Kontaktangaben im Metadatensatz aktualisiert.
//gmd:organisationName/gco:CharacterString
Die Aktualisierung des Zeitstempels erfolgt über einen absoluten XPath-Ausdruck.
/gmd:MD_Metadata/gmd:dateStamp/gco:Date
XMLStarlet ermöglicht die Bearbeitung von XML-Dokumenten über das Unterkommando edit
. Hierbei wird mit dem Parameter -u
der XPath-Ausdruck des zu ändernden XML-Elements übergeben. Der zu setzende Element-Wert wird mit dem Parameter -v
übergeben. Die Ergebnisausgabe erfolgt standardmäßig auf stdout
.
xmlstarlet edit \ -u "//gmd:organisationName/gco:CharacterString" -v 'Neuer Organisationsname' \ -u "/gmd:MD_Metadata/gmd:dateStamp/gco:Date" -v '2014-01-29' \ 40f7b25c-3a78-30e8-a6fd-e0a24b818b63.xml
Hinweis: Durch einen
\
(Backslash) kann ein Linux-Kommando mehrzeilig eingegeben werden.
Zur einfachen Kontrolle kann die Bildschirmausgabe mit grep
gefiltert werden.
$ xmlstarlet edit \ -u "//gmd:organisationName/gco:CharacterString" -v 'Neuer Organisationsname' \ -u "/gmd:MD_Metadata/gmd:dateStamp/gco:Date" -v '2014-01-29' \ 40f7b25c-3a78-30e8-a6fd-e0a24b818b63.xml \ | grep "2014-01-29\|Neuer Organisationsname"
Bei erfolgreicher Aktualisierung des XML-Dokuments werden die editierten Zeilen ausgegeben.
<gco:CharacterString>Neuer Organisationsname</gco:CharacterString> <gco:Date>2014-01-29</gco:Date> <gco:CharacterString>Neuer Organisationsname</gco:CharacterString> <gco:CharacterString>Neuer Organisationsname</gco:CharacterString>
Mit dem Parameter --inplace
kann das Ergebnis in die Datei zurückgeschrieben werden.
$ xmlstarlet edit --inplace \ -u "//gmd:organisationName/gco:CharacterString" -v 'Neuer Organisationsname' \ -u "/gmd:MD_Metadata/gmd:dateStamp/gco:Date" -v '2014-01-29' \ 40f7b25c-3a78-30e8-a6fd-e0a24b818b63.xml
Aktualisierung mehrerer Metadatensätze
Über eine einfache For-Each-Schleife können alle Metadatensätze in einem Verzeichnis aktualisiert werden.
$ for f in *.xml ; \ do \ echo 'Aktualisierung von:' $f ; \ xmlstarlet edit --inplace \ -u "//gmd:organisationName/gco:CharacterString" -v 'Neuer Organisationsname' \ -u "/gmd:MD_Metadata/gmd:dateStamp/gco:Date" -v '2014-01-29' \ $f ; \ done