Very SimpleXML
18. März 2008 von Tom
SimpleXML ist eine Funktionsbibliothek von PHP, die es ermöglicht einfach (eben “simple”) auf XML Daten zuzugreifen und mit ihnen umzuspringen. Das schöne daran: Sie startete mit PHP 5 und unterstützt Objektorientierte Programmierung von PHP 5.
Auf dem Usergruppen Treffen am 13. März 2008 habe ich einen Stand-Up-Vortrag über das Extenden von SimpleXML gehalten den ich nun mit diesem Beitrag auf unserer Homepage nachbereiten und erweitern möchte. Einfache eigene Erfahrungen mit SimpleXML sind von Vorteil zum Verständnis des Artikels.
Die Möglichkeiten
SimpleXML ist schon von Hause aus sehr simpel. Es sollte immer die aktuelle Version eingesetzt werden, da in der Geschichte dieser Erweiterung es manchmal verschiedene Interpretationen über einzelne Methoden gab, so das zwischen Bugs und Documentation Problems schon mal ein Bäumchen-Wechsel-Dich-Spielchen entstehen konnte. Dies und andere Kinderkrankheiten sind aber mitlerweile aus dem Weg geräumt und sie fallen auch nicht soviel ins Gewicht, wenn man sich die Fähigkeiten von OOP unter PHP zu Nutze macht:
- SimpleXMLElement Extenden (Vererben)
- SimpleXMLIterator: Der SPL-Iterator auf SimpleXML
Anm.: Den ersten Punkt habe ich auf dem Märztreffen angesprochen, der zweite Punkt wird auch nochmal auf dem Apriltreffen gezeigt, ist aber im Grunde das selbe, da es sich auch um das Extenden vom SimpleXMLElement handelt. Da der SPL Iterator so ein anschauliches Beispiel ist, habe ich ihn in die Thematik mit rein genommen.
SimpleXML Extenden (Vererben)
Das Vererben eines SimpleXMLElement funktioniert wie das Vererben jeder anderen PHP5-Klasse auch:
-
<?php
-
class VerySimpleXMLElement extends SimpleXMLElement
-
{
-
// …
-
}
-
?>
Soweit noch keine Magie. Die Besonderheit bei SimpleXML ist jedoch, das bei der Instanzierung, zB. in den Funktionen simplexml_load_string und simplexml_load_file, der Klassenname als zweiter Parameter optional mit angegeben werden kann. Dies hat dann den gleichen Effekt wie die Instanzierung der eigenen, abgeleiteten Klasse über das Schlüsselwort new:
-
<?php
-
$vsx = simplexml_load_file($filename, ‘VerySimpleXMLElement’);
-
$vsx = simplexml_load_string($xmldata, ‘VerySimpleXMLElement’);
-
$vsx = new VerySimpleXMLElement($xmldata);
-
?>
Der Clou daran ist, dass sich das abgeleitete, VerySimpleXMLElement automatisch über alle Unterobjekte erstreckt. Bei der Besprechung in der Usergruppe kam die Frage auf ob das nicht bei jedem PHP5-Objekt der Fall wäre. Dies kann getrost verneint werden, den dies muss einem Objekt erst beigebracht werden. Das SimpleXMLElement kann dies von Haus aus und dies genau ist es, was das extenden so brauchbar und praktisch macht. Vielleicht auch eine Anregung für die eigene Programmierung.
Da nun auch alle Unterobjekte von der Programmierer-eigenen Klasse abstammen, können an zentraler Stelle die für die eigene Aufgaben fehlenden Routinen gesetzt werden. Zb. ein eingänglicherer Zugriff auf Attribute. Möchte ich diese zB. optional behandeln hilft eine einfache Funktion weiter:
-
<?php
-
class VerySimpleXMLElement extends SimpleXMLElement
-
{
-
private function getAttributeArray()
-
{
-
}
-
-
public function getAttribute($name, $default=”)
-
{
-
$attrs = $this->getAttributeArray();
-
{
-
return (string) $attrs[$name];
-
}
-
return (string) $default;
-
}
-
-
public function getAttributeCount()
-
{
-
}
-
-
public function hasAttributes()
-
{
-
return (bool) $this->getAttributeCount();
-
}
-
}
-
?>
Auf diese kann nun durchgehend zugegriffen werden. Es braucht lediglich das eigene SimpleXMLElement verwendet werden.
Als Wermutstropfen bleibt allerdings das der Constructor als auch die Magic-Methods des Overloading beim OOP leider nicht angetastet werden können. Der eine oder andere Workaround fürs letztere befindet sich in der Linksammlung am Ende des Artikels. Allerdings Geschmacksache und vielleicht ist in diesem Punkt bei der Entwicklung der SimpleXML Extension auch noch nicht aller Tage Abend.
SimpleXMLIterator: Der SPL-Iterator auf SimpleXML
Das Erklärte lässt genug Luft für eigene Laufversuche. Aber damit hört es noch nicht auf. Dass das Extenden von SimpleXML richtig Sinn machen kann, hat auch der Entwickler Markus Börger erkannt und in seine SPL-Erweiterung den SimpleXMLIterator eingebaut. Dies im anschaulichen Beispiel folgt nach der Veranstaltung im April.
Weiteres
Während des Vortrages in der Usergroup ist noch eine kleine Linksammlung zum Thema PHP und XML entstanden:
- XML for PHP developers, Part 1: The 15-minute PHP-with-XML starter (Cliff Morgan, 2007-02)
- XML for PHP developers, Part 2: Advanced XML parsing techniques (Cliff Morgan, 2007-03)
- XML for PHP developers, Part 3: Advanced techniques to read, manipulate, and write XML (Cliff Morgan, 2007-03)
- Parsing XML using SimpleXML (Tim Koschuetzki, 2007-05)
-
Probleme und Wissenwertes beim Extenden von SimpleXML
- Overloading 1: Extending SimpleXML, Issues with extending SimpleXML, Microformats extension to SimpleXML (Oliver Brown, 2005-08/2005-09)
- Overloading 2: Extending SimpleXML (Loïc Hoguin, 2008-02)
- How to extend SimpleXML with missing functionality (Christian Stocker, 2005-11)
- simplexml liefert uncatchable errors (Martin, 2008-03)
PHP Usergroup Frankfurt am Main (PHPUGFFM)
