XML DOM-Struktur mit PHP in einem Array speichern
Manchmal liegen Datensätze nicht in Datenbank-, sondern in XML- oder HTML-Form bereit. PHP bietet mit der «PHP DOM» Klasse zwar eine gute Möglichkeit, diese Daten zu verarbeiten. Manchmal eignen sich aber Arrays besser, um die Daten zu behandeln.
Mit der Funktion «dom2array», die ich Ihnen in diesem Artikel vorstellen möchte, können DOM-Strukturen genau auf ein mehrdimensonales Array abgebildet werden.
«PHP DOM» bietet zwar an sich schon gute Verarbeitungsmöglichkeiten für (X)HTML- oder XML-Dateien, aber wer lieber mit Arrays arbeitet, sollte sich diese Funktion anschauen. Mit der vorgestellten Funktion werden alle Tags – Knoten – im DOM-Dokument als in einem mehrdimensionalen Array abgebildet.
Der Quelltext
/** * Konvertiert ein DOM-Objekt in einen Array. * Achtung: Eventuell etwas rechenintensiv bei grossen DOMs * @param object $domroot Elternknoten */ function dom2array ( $domroot ) { $rootchildren = $domroot->childNodes; $array = Array(); if ( $domroot->hasChildNodes ( ) ) { for ( $i = 0; $i < $rootchildren->length; $i++ ) { $rootchild = $rootchildren->item($i); $current_item = count($array); // < neues Item if ( $rootchild->nodeType == XML_ELEMENT_NODE ) { if ( $rootchild->hasChildNodes ( ) ) $array[$current_item] = dom2array ( $rootchild ); // < dom2array eine Ebene Tiefer $array[$current_item]['name'] = $rootchild->nodeName; // < Tag $array[$current_item]['value'] = $rootchild->nodeValue; // < Inhalt if ( $rootchild->attributes !== NULL ) { foreach ( $rootchild->attributes as $rootattribute => $rootvalue ) { $array[$current_item][$rootattribute] = $rootvalue->value; // < [ATTRIBUT] = Wert } } } } } return $array; }
Als Parameter wird ein Wurzelelement erwartet, welches mit «PHP DOM» erstellt wurde. Dies muss nicht das erste Tag sein, es können auch nur Teilstücke in einen Array umgewandelt werden.
Wie es funktioniert
Die Funktion «dom2array» fügt dem Array alle Knoten – Tags – hinzu, die eine Ebene tiefer als das Wurzelelement sind («childNodes»). Findet die Funktion weitere Kindknoten(«hasChildNodes»), ruft sich die Funktion selbst auf, diesmal jedoch wird das Wurzelelement eine Ebene tiefer gesetzt. Findet diese erneut aufgerufene Funktion eine Ebene tiefer wieder Kindknoten ruft sie sich erneut auf, um diese dem Array hinzuzufügen. Dieses Prinzip wird wiederholt, bis keine neuen Kindknoten mehr gefunden werden(«hasChildNodes» == false).
Beispiel
Die Funktion könnte aus diesem XML-Dokument:
Item 1 http://example.org
Diesen Array erzeugen:
Array
(
[0] => Array
(
[0] => Array
(
[name] => name
[value] => Item 1
)
[1] => Array
(
[name] => url
[value] => http://example.org
)
[name] => item
[value] =>
Item 1
http://example.org
[id] => 1
)
)
Anmerkung: Auch Textelemente und andere Inhalte werden mit DOM als Knoten dargestellt. Möchten Sie dieses verhalten unterbinden, genügt eine einfache IF-Abfrage nach dem Knotentyp mit «nodeType». Natürlich ist die Funktion noch klar Ausbuafähig.
- geschrieben von André Rösti am Friday, 2. October 2009
- •
- abgelegt unter Web-Programmierung
- •
- Schlagworte: DOM, PHP DOM, XML
Kommentare
Dieser Artikel wurde noch nicht kommentiert.