PHP bietet auch einen DOM-Parser an, der ein komplettes XML-Dokument in den Hauptspeicher lädt. Ein solches Laden ist nur für kleine XML-Dateien praktikabel, da sonst sowohl der Arbeitsspeicher nicht reicht wie auch der Benutzer auf das Laden des Dokumentes längere Zeit warten muss, bis Informationen ausgelesen werden können. Nun ist es allerdings möglich, sich innerhalb der DOM-Struktur – mit DOM wird der Baum bezeichnet, den ein XML-Dokument darstellt – zu bewegen und auch diese Struktur sogar zu verändern. Folgendes kleine Programm demonstriert dies:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php $xmlDocument = new DOMDocument(); $xmlDocument->loadXML (file_get_contents('svgexample.svg')); $svgElement = $xmlDocument->firstChild; echo ("Anzahl Kindknoten: ".$svgElement->childNodes->length."\n"); $i = 0; foreach ($svgElement->childNodes as $child) echo ($i++.': '.$xmlDocument->saveXML($child)."\n"); $svgElement->removeChild( $svgElement->getElementsByTagName('circle')[0]); $rechteck = $xmlDocument->createElement("rect"); $rechteck->setAttribute("x",10); $rechteck->setAttribute("y",10); $rechteck->setAttribute("width",60); $rechteck->setAttribute("height",60); $svgElement->appendChild($rechteck); echo $xmlDocument->saveXML(); ?> |
In der zweiten Zeile wird das DOMDocument
erzeugt, welches mit dem Inhalt der Datei svgexample.svg
in Zeile 3 über den Aufruf von loadXML()
gefüllt wird. Mit dem ersten firstChild
-Aufruf in der vierten Zeile wird $svgElement
der SVG-Wurzelknoten zurückgegeben. Unter childNodes
lässt sich eine durchlaufbare Liste abrufen, welche die Kindknoten beinhaltet. Hierbei handelt es sich nicht nur um die vier Tags, die auf dieser Ebene existieren, sondern auch um eventuellen Text, der vor und nach diesen Tags steht. So werden in dem gezeigten Fall neun Einträge zurückgeliefert, die in der darauffolgenden Schleife nacheinander ausgegeben werden.
Nun geht es an die Manipulationen: Mit removeChild
ist es möglich, einen Kindknoten eines Knoten zu entfernen. Dabei ist es wichtig, dass dieser Knoten auch ein direkter Kindknoten ist. In dem gezeigten Fall wird der Kindknoten unter allem dem $svgElement
folgenden Knoten gesucht, der den Tagnamen circle
trägt. Es wird eine Liste an Knoten geliefert, für die dies der Fall ist. Nachfolgend wird nur der erste und in diesem Fall einziger Knoten genutzt. Nach dem Aufruf verschwindet der Kreis innerhalb des SVG-Bild. Im Folgenden wird dieser Kreis nun durch ein Rechteck ersetzt. Dieses wird zunächst durch einen Aufruf auf dem DOMDocument
über createElement()
erzeugt, dann mit den passenden Attributen mit setAttribute()
belegt und schließlich mit appendChild()
an die passende Position, nämlich an das $svgElement
angefügt.
In der letzten Zeile wird das gesamte XML-Dokument mit Hilfe von saveXML()
wieder ausgegeben.
Unser kleines Demonstrationsprogramm reicht nicht aus, um alle Features, die enthalten sind, zu demonstrieren. Unter anderem ist es möglich, auch Knoten mit replaceChild
auszutauschen. Mit cloneNode()
lassen sich Kopien ganzer Teilbäume anfertigen. Mit hasChildNodes()
bzw. mit hasAttributes()
ist es möglich, zu prüfen, ob Kinder existieren oder ob ein Knoten Attribute beinhaltet. Mit removeAttribute()
lassen sich Attribute auch von Knoten entfernen. Zu Funktionen, wo dies möglich ist, existieren Varianten, die auch Namespaces verarbeiten können. Zusätzlich ermöglicht diese Bibliothek es nicht nur XML-Dokumente zu verarbeiten, sondern Sie können auch HTML-Dokumente lesen und verändern.