XML Manipulation mit PHP

Heute ist Sonntag und ich hatte mal wieder ein wenig Zeit, um mich für zwei anstehende Projekte ausgiebig zu informieren. Diese beiden Projekte beschäftigen sich intensivst mit XML und dem Document Object Model (DOM).

XML Manipulation mit PHP
XML Manipulation mit PHP

Zum einen steht in Zusammenarbeit mit Racoon Productions eine Flash-Website, welche sich alle darzustellenden, änderbaren Inhalte aus einer XML Datei zieht, an. Danach geht es weiter mit einem Mamut Projekt für die vs vergleichen-und-sparen GmbH, welches Daten aus HTML Dokumenten extrahieren und aufarbeiten muss.

Die bereits mit einem Beispiel beschriebene SimpleXML Extension von PHP reicht für mein Vorhaben bei weitem nicht aus. So habe ich mir heute mal die mächtige DOM Extension von PHP zu Gemüte geführt. Die heute kennengelernten Möglicheiten möchte ich Euch nicht vorenthalten und anhand einiger einfacher Beispiele verdeutlichen.

Erste Schritte

Nehmen wir uns hier einfach mal vor einen XML Elementbaum mit nur einem XML Element „root“ anhand des PHP DOMDocument Objektes zu erstellen. Im Grunde genommen hält PHP diesen Schritt ziemlich klein.

// Neues DOMDocument Objekt
$dom = new DOMDocument('1.0', 'utf-8');

// Neues Element root
$root = $dom->createElement('root');
$dom->appendChild($root);

// Ausgabe: < ?xml version="1.0" encoding="utf-8"?>
echo $dom->saveXML();

So haben wir mit diesem Beispiel einen einfachen XML String mit einem leeren Element „root“ erzeugt. Aber was wären komplexe XML Konstrukte ohne eine entsprechende Document Type Declaration (DTD)? So kommen wir zum nächsten Schritt.

Wie verdammt bekomme ich meine DTD da rein?

Genau vor diesem Problem stand ich nämlich mit dem Flash Projekt. Es hat mich eine Menge Zeit gekostet mich durch die PHP Dokumentation zu lesen. Letztendlich habe ich eine Möglichkeit gefunden mittels dem PHP DOMImplementation Objekt komfortabel eine DTD für mein XML Dokument festzulegen

// Neues DOMImplementation Objekt
// erzeugt: < !DOCTYPE content SYSTEM "content.dtd">
$implementation = new DOMImplementation();
$dtd = $implementation->createDocumentType('content', '', 'content.dtd');
$dom = $implementation->createDocument('', '', $dtd);

// Encoding festlegen
$dom->formatOutput = true;
$dom->encoding = 'UTF-8';

// Root Knoten erstellen
$root = $dom->createElement('root');
$dom->appendChild($root);

// Ausgabe
echo $dom->saveXML();

Mit dem DOMImplementation Objekt ist es möglich einen Dokumententypen festzulegen. Im Beispiel erzeugen wir eine extra für unser XML Dokument erstellte DTD, welche in einer gesonderten Datei content.dtd zu finden ist. Weitere Informationen zum Thema DTD entnehmt bitte den Erklärungen auf SelfHTML.

Wie? Das muss vernünftig aussehen?

Im Grunde genommen hätten wir mit der Einbindung der DTD schon alles beisammen. Ich für meinen Teil muss die XML Elemente für eine schöne Ausgabe aber noch über eine für das Projekt relevante XSL Datei formatieren, damit es auf der Flash Webseite dann auch vernünftig dargestellt wird. Kein Thema, dachte ich mir, nachdem ich die DTD Hürde genommen habe. Ist aber doch ein Thema, weil man mit dem DOMImplementation Objekt kein XSL Stylesheet einbinden kann. Die Lösung ist aber denkbar einfach:

// Neues DOMImplementation Objekt
// erzeugt: < !DOCTYPE content SYSTEM "content.dtd">
$implementation = new DOMImplementation();
$dtd = $implementation->createDocumentType('content', '', 'content.dtd');
$dom = $implementation->createDocument('', '', $dtd);

// Neues DOMPrecessingInstruction erstellen
// erzeugt: < ?xml-stylesheet type="text/xsl" media="screen" href="content.xsl">
$xsl = new DOMProcessingInstruction( 'xml-stylesheet', 'type="text/xsl" media="screen" href="content.xsl"');

// Im Dokument einbinden
$dom->appendChild($xsl);

// Encoding festlegen
$dom->formatOutput = true;
$dom->encoding = 'UTF-8';

// Root Knoten erstellen
$root = $dom->createElement('root');
$dom->appendChild($root);

// Ausgabe, aber diesmal als XML Datei auf dem Server
echo 'Habe gerade: ' . $dom->save("test.xml") . ' Bytes auf den Server geknallt.';

Auch für die Einbindung von XSL Stylesheets gibt es in PHP das entsprechende Objekt. Mit dem DOMProcessingInstruction Objekt ist die Eindbindung denkbar einfach. Es wird einfach eine neue Instanz des Objektes erstellt. Als Parameter werden hier lediglich der Name des Elements und die dazugehörigen Werte mitgegeben und über die endsprechende appendChild Methode eingebunden. Somit hätten wir jetzt auch unsere XSL Datei eingebunden. Komischerweise gab es bei der reinen Ausgabe des XML Strings mittels $dom->saveXML() Probleme. Die eingebundene XSL Datei wurde vom Browser nicht interpretiert. Da im späteren Live Betrieb des Projektes aber ohnehin keine direkte Ausgabe, sonderen ein Speichern des XML Strings auf dem Server stattfindet, habe ich das gleich mal im Beispiel mit eingebunden und siehe da: das Stylesheet wird ohne Probleme interpretiert. Wer aber dennoch die Lösung für das Problem bei einer direkten Ausgabe kennt, kann hier gern einen Kommentar hinterlassen.

Anwendungsbebiete

Wie zu Beginn dieses kleinen Tutorials bereits angesprochen, gibt es mehrere Einsatzmöglichkeiten für diese Technik. Ich für meinen Teil benutze dieses Vorgehen beim dynamischen Erstellen von XML Dokumenten. Anwendung findet das ganze für ein PHP Backend, welches die Inhalte eines Flash Frontends steuert. So können in diesem Projekt z.B. komfortabel News und Daten in eine Agenda eingetragen werden, die dann von der Flash Anwendung komfortabel über die so erstellte XML Datei ausgelesen werden. Darüber hinaus sind die Anwendungsgebiete aber weit gestreut. Neben der Erzeugen von XML Dokumenten ist auch das Verarbeiten von XML oder DOM ein wesentlicher Bestandteil des PHP Document Object Models. Dazu aber mehr, wenn ich das Projekt für die IAK GmbH genauer beschreibe.

Wir ihr seht also alles andere als Raketenwissenschaft.

Sie benötigen uns für die Realisierung Ihrer Ideen im Internet? Treten Sie mit uns in Kontakt. Ein unverbindliches Angebot ist für uns Ehrensache!

7 Gedanken zu „XML Manipulation mit PHP“

  1. DTD wird ja nicht bei BiPRO benutzt sondern eine XML Schema das in xsd-Datien abgebildet ist. Ich muss die XML-Struktur aus den verschachtelten xsd-Datien nachbilden und verzweifle gerade. vor allem an der Namespacezuweisung der neuen XML. Diese ganzen Ableitungen und Querverweise treiben mich in den Wahnsinn. 🙂 Ich frag mich wie man daraus XML bauen soll. Meine Daten kommen nicht aus BiPRO sondern aus irgendeinen Web-Service der SOAP verwendet. Die Daten hab ich mittlerweile in Arrays zwischengespeichert. Nun muss das alles in BiPRO-XML rein. Ich hab aber weder von BiPRO richtig Ahnung noch von XML Schemas. Zum nicht im Zusammenhang mit Namespaces und Verschachtelungen.

    Antworten
    • Hi Marcel,

      im Zusammenhang mit BiPRO übernehmen der SOAP Client als auch der SOAP Server das Erstellen der XML Struktur. Die Response eines Soap Webservices parse ich normalerweise in die entsprechenden Entitäten (Modelle), indem ich dem SOAP Client eine entsprechende Classmap übergebe. In dieser Classmap werden den BiPRO Typen die entsprechenden PHP Klassen zugewiesen. Der Rest funktioniert dann voll automatisch.

      Im Idealfall musst Du also kein XML „bauen“, weil das der SOAP Client für Dich macht. Du übergibst lediglich die entsprechenden Klassen, die als Parameter an die Webservice Funktionen übergeben werden.

      Antworten

Antworten auf MarcelAntwort abbrechen

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.