Version aus RDF-Datei auslesen

Wer Firefox-Addons selbst hostet, möchte gegebenenfalls die aktuelle Versionsnummer seiner Extension automatisch auf seiner Addon-Homepage anzeigen lassen. Quelle der Versionsnummer soll die Datei update.rdf sein. Als ich RegExp noch für eine Paketzusteller-Firma hielt, habe ich dies mit einem – für heutige Verhältnisse abscheulichen Stückchen Code – gelöst.

Folgender Code wurde genutzt, um die Versionsnummer einer Firefox-Extension auszulesen. Bitte anschnallen, und vielleicht sogar einen Eimer neben sich bereithalten:

$xmlFieldNames=array("version");
foreach ($xmlFieldNames as $xmlField) {
  if(strpos($xmlRaw,$xmlField)!==false) {
    $parsedXML[$xmlField]=substr($xmlRaw,
    strpos($xmlRaw,"<em:$xmlField>")+
    strlen("<em:$xmlField>"),
    strpos($xmlRaw,"</em:$xmlField>")-
    strlen("<em:$xmlField>")
    -strpos($xmlRaw,"<em:$xmlField>"));
  }
}

echo $parsedXML['version'];

Auf diesen Code gehe ich aus Selbstschutz und Schutz unserer Leser nicht näher ein. Jeder sieht die diabolische Mischung aus einer Schleife und diversen String-Funktionen. 🙁

Der heilige Gral – RegExp ?

Vielmehr möchte ich nun auf die Lösung mit RegExp eingehen, die nicht nur ungleich schöner, sondern auch kürzer ist. Folgend der RegExp-Code:

$xmlRaw = file_get_contents("update.rdf");
preg_match("/NS1:version=[\"'](.*)[\"']/", $xmlRaw, $treffer);
echo $treffer[1];

Der Vergleich mit dem Original-Code spricht natürlich Bände. 😉 Zeile 2 der Code-Box beinhaltet nun den entsprechenden RegExp-Code. Um zu verstehen, wie eine RDF-Datei aussieht, hier ein Beispiel.

Der entsrpechende Knoten, den es zu finden gilt, ist dieser:

<RDF:Description RDF:about="rdf:#$CPM5V3" NS1:version="1.3.0">

Darin befindet sich unser Attribut mit der Versionsnummer.

Nun zum RegExp-Code:

/NS1:version=[\"'](.*)[\"']/

Umschlossen von den obligatorischen Delimitern (/) befindet sich der eigentliche Ausdruck. Entsprechend dem Knoten suchen wir also NS1:version, bzw. den Wert dessen. Also den Wert nach dem Gleichheitszeichen (=). Dazu ist folgender Code zuständig:

[\"'](.*)[\"']

Generell bedeutet der Ausdruck (.*), dass wir den Wert, der an dieser Stelle vorhanden ist, lesen wollen. Da ein Attribut aber sowohl in einfachen als auch doppelten Anführungszeichen stehen kann, also sowohl als

attribut="wert"

als auch

attribut='wert'

decken wir mit

[\"']

beide Varianten ab, denn dieser Ausdruck bedeutet: Entweder “ oder ‚ .

Nachgefragt

Gibt es bessere Lösungen, um bestimmte Attribute aus XML(-ähnlichen)-Dokumenten auszulesen? Lasst es uns wissen in den Kommentaren oder per E-Mail.

Kommentare geschlossen.