Aktualisierung von ISO-19139-Metadaten mit XMLStarlet

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert