PHP: SimpleXML und XMP Sidecar

SQLite und PHP

XMP (Extensible Metadata Platform) ist eine Variante von XML und wird auch als Sidecar bezeichnet. Für Dateiformate, die XMP nicht einbetten können, legen Bilddatenbanken wie Lightroom XMP-Dateien als Filialdatei im selben Verzeichnis mit demselben Namen, aber der Endung .xmp oder .XMP ab.

XML – Schnittstelle zwischen Anwendungen

Darktable legt den XMP-Sidecar für jede Bilddatei an. Und dann haben wir auch noch das SVG-Format, das weder von Lightroom noch von Darktable erkannt wird. XML ist eine außerordentlich flexible Markup-Sprache. Es gibt keine festen Tag-Namen, sondern Tags können frei gewählt werden. Neben einfachen Namen für XML-Tags agiert XML mit Namensräumen (namespaces), die z.B. spezialisierten Anwendungen wie RSS, Atom und XMP den Zugang zu Informationen ermöglichen.

Da Betriebssysteme den Sidecar nicht erkennen, geht der Sidecar verloren, wenn eine Datei in ein anderes Verzeichnis kopiert wird. Das ist der Nachteil der Sidecar-Technik. Auf der anderen Seite muss die Bilddatei bei jeder Änderungen der Metadaten komplett ausgelesen und neu geschrieben werden. Für Archive, die sorgfältig verschlagwortet werden, muss dann auch noch die vollständige Bilddatei bei jeder Änderung erneut ins Backup übernommen werden.

XMP-Dateien sind ein Wespennest von tief verschachtelten Namespaces – Namensräumen.





		

XMP Namespace

Zu jedem Namespace gehört eine eindeutige URL, die den Namensraum für Anwendungen identifiziert, und mit einem xmlns-Attribut deklariert wird.

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
…
<rdf:Description rdf:about="" xmlns:lightroom="http://ns.adobe.com/lightroom/1.0/">

Diese URLs verweisen meist auf eine nicht-existierende Seite und dienen nur zur Identifizierung des Namensraums.

In einem XML-Dokument können mehrere Namensräume liegen, ein XMP-Sidecar wird von Namensräumen geradezu überflutet. Namensräume setzen einen Präfix mit einem Doppelpunkt vor das Element. Per Vorgabe ignoriert PHP SimpleXML Elemente mit Präfix und ihre Attribute.

Im Beispiel oben gibt es kein Element ohne Namespace (SimpleXML würde also keine Elemente zurückgeben).

creator, subject, title, rights haben einen dc-Präfix. dc steht für Dublin Core und der dc-Namensraum ist

xmlns:dc="http://purl.org/dc/elements/1.1/"

PHP SimpleXML und Namespace

SimpleXML hat zwei Methoden für die Identifizierung von Namensräumen.

getDocNamespaces und getNamespaces geben jeweils ein Array des root-Namespace zurück.

Array
(
    [x] => adobe:ns:meta/
)

$doc_ns = $xmp->getDocNamespaces(true) gibt ein Array aller Namensräume zurück.

$ns = $xmp->getNamespaces(true); gibt ein Array der Namensräume zurück, die im Dokument benutzt werden, auch Namespaces von Attributen wie xml:lang="x-default.

$file = 'svg/geolocation.XMP';
$xmp  = simplexml_load_file($file);

$doc_ns = $xmp->getDocNamespaces(true);
$ns     = $xmp->getNamespaces(true);

print_r($doc_ns);
print_r($ns);

Das liefert für das XMP-Beispiel oben:


		

Oben die Ausgabe von getDocNamespaces(true), unten von getNamespaces(true).

Zugriff auf die Metadaten mit PHP XPATH

Im Beispiel oben liegen hierarchische Stichwörter à la Lightroom. Auslesen mit

$xmp -> registerXPathNamespace('rdf', $ns['rdf']);
$xmp -> registerXPathNamespace('lightroom', $ns['lightroom']);
$nodes = $xmp -> xpath('//lightroom:hierarchicalSubject//rdf:Bag//rdf:li');
foreach ($nodes as $node) {
	echo $node . "<br>";
}