Anzeige
Tutorialbeschreibung

PHP - Teil 38 - XML (Teil 3): Dokumente mit XMLWriter erstellen

PHP - Teil 38 - XML (Teil 3): Dokumente mit XMLWriter erstellen

In diesem Video-Training geht es um die Erweiterung XMLWriter. Mit dieser Erweiterung lassen sich XML-Dokumente erstellen. Das Paket lässt sich sehr einfach nutzen und besitzt vergleichsweise wenige Funktionen. Diese geringe Funktionsanzahl wirkt sich allerdings überhaupt nicht negativ aus. Ganz im Gegenteil: Denn dadurch ist XMLWriter sehr leicht erlernbar und somit letztendlich auch schnell einsetzbar.

Icon-Ersteller: Oxygen-Team

... übrigens findest du die komplette Serie hier: PHP-Workshop-DVD - Basics & Tricks - Schnapp sie dir in unserem Shop oder in der Kreativ-Flatrate!


Die XMLWriter-Erweiterung ist standardmäßig bei PHP 5 aktiviert. Ob das tatsächlich der Fall ist, kann wieder ganz einfach über die Funktion phpinfo() überprüft werden.

Bilder



Im Ausgabefenster gibt es den Bereich xmlwriter. Sollte jemand PHP selbst kompilieren und XMLWriter nicht mit installieren wollen, muss einfach --disable-xmlwriter angegeben werden.

Ein erstes Beispiel soll zeigen, wie sich XMLWriter nutzen lässt. Zunächst die verwendete Syntax:

<?php
$mem = xmlwriter_open_memory();
if (false == $mem) { 
   die ("Der Speicher konnte nicht freigegeben werden.");
} 
xmlwriter_start_document($mem,"1.1");
xmlwriter_write_element($mem,"content","Hallo, Welt!");
xmlwriter_end_document($mem);
$xml_data=xmlwriter_output_memory($mem);
file_put_contents("ausgabe.xml",$xml_data);
?>


Ruft man diese Datei im Browser auf, wird eine leere Seite angezeigt. Das Entscheidende passiert hier tatsächlich im Hintergrund. Denn durch das Aufrufen der Datei wird automatisch die Datei ausgabe.xml erzeugt. Öffnet man diese im Browser, ergibt sich folgendes Bild:

Bilder



 
Es handelt sich hier zwar nur um ein sehr einfaches, dafür aber dennoch vollständiges XML-Dokument. Das zeigt auch ein Blick in den Quelltext.

<?xml version="1.1"?>
<content>Hallo, Welt!</content>


Und jetzt ein Blick auf die Bestandteile der PHP-Syntax.

$mem = xmlwriter_open_memory();


Durch diese Zeile wird ein neuer XMLWriter erzeugt. Erst dadurch können Zeichenketten (im Endeffekt also die XML-Syntax) in den Speicher geschrieben werden. Ob der Speicher tatsächlich freigegeben wurde und somit das Dokument angelegt werden kann, wird über eine einfache if-Abfrage überprüft.

if (false == $mem) {
   die ("Der Speicher konnte nicht freigegeben werden."); 
}


Jetzt kann mit dem Anlegen des Dokuments begonnen werden. Dabei muss als erste Funktion immer xmlwriter_start_document() angegeben werden.

xmlwriter_start_document($mem,"1.1");


Über xmlwriter_start_document() wird die XML-Deklaration beschrieben.

<?xml version="1.1"?>


Dabei stehen verschiedene Parameter zur Auswahl, über die sich diese Deklaration gestalten lässt. Im vorherigen Beispiel wurden zwei Parameter verwendet. Der erste Parameter enthält die XMLWriter-Ressource. Über den zweiten Parameter wird die Versionsnummer des XML-Dokuments bestimmt. Momentan sind dabei nur die Werte 1.0 (das ist Standard) und 1.1 möglich bzw. sinnvoll.

Die Kodierung des Dokuments lässt sich über den dritten Paramater bestimmen. Typische Werte können hier UTF-8 und ISO-8859-1 sein. Zu guter Letzt kann man noch festlegen, ob die DTD innerhalb oder außerhalb des XML-Dokuments steht bzw. ob das Dokument überhaupt eine DTD besitzt. Mögliche Werte sind yes und no.

Verwendet man die drei beschriebenen Parameter, könnte das im Ergebnisdokument folgendermaßen aussehen.

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>


Jetzt geht es mit der Definition der eigentlichen Elemente los. Um ein Element zu definieren, wird die Funktion xmlwriter_write_element() verwendet.

xmlwriter_write_element($mem,"content","Hallo, Welt!");
Auch hier können einige Parameter angegeben werden. Der erste Parameter entspricht der XMLWriter-Ressource. Parameter zwei ist der Name des Elements. Über den dritten Parameter legt man den Inhalt des Elements fest. Die gezeigte Syntax führt zu folgender Ausgabe:

<content>Hallo, Welt!</content>


XMLWriter sorgt also automatisch dafür, dass das Element richtig geschlossen wird.

Da das Dokument am Anfang über die Funktion xmlwriter_start_document() explizit gestartet wurde, muss es auch wieder geschlossen werden. Verwendet wird dafür die Funktion xmlwriter_end_document().

xmlwriter_end_document($mem);


Nun wird das Schreiben der Syntax in ein Dokument vorbereitet. Dafür muss man sich zunächst den aktuellen Puffer zurückliefern lassen und diesen innerhalb einer Variablen speichern.

$xml_data=xmlwriter_output_memory($mem);


Um aus der XML-Syntax direkt ein XML-Dokument zu generieren, wird file_put_contents() verwendet.

file_put_contents('ausgabe.xml',$xml_data);


Dieser Funktion übergibt man als Parameter den gewünschten Dateinamen und den Inhalt, der letztendlich dem zuvor in der Variablen $xml_data gespeicherten Puffer entspricht.


Elemente verschachteln

Im vorherigen Beispiel wurde ein einfaches Dokument erstellt, in dem lediglich ein Element enthalten gewesen ist. Solche Dokumente kommen in der Praxis allerdings eher selten vor. Meistens benötigt man Elemente, die wiederum Elemente enthalten. Ein typisches Beispiel dafür könnte folgendermaßen aussehen:

<?xml version="1.1"?>
<katalog>
  <titel>Fever Pitch</titel>
  <autor>Hornby, Nick</autor>
</katalog>


In diesem Fall besitzt katalog die beiden Unterelemente titel und autor. Um ein Element zu öffnen, das erst später wieder geschlossen wird, wird die Funktion xmlwriter_start_element() verwendet. Dieser Funktion übergibt man die XML-Ressource und den Elementnamen. Im aktuellen Beispiel wird darüber das Element katalog generiert. Ein über xmlwriter_start_element() geöffnetes Element sollte immer explizit geschlossen werden. Dafür gibt es die Funktion xmlwriter_end_element(). Insgesamt sieht die Definition des katalog-Elements also folgendermaßen aus:

xmlwriter_start_element($mem,"katalog");
xmlwriter_end_element($mem);


In dieses Element sollen nun wiederum zwei weitere Elemente eingefügt werden. Eingesetzt wird dafür die Funktion xmlwriter_write_element(), die bereits vorgestellt wurde. Diese Funktion wird im aktuellen Beispiel zwischen xmlwriter_start_element() und xmlwriter_end_element() eingesetzt.

xmlwriter_start_element($mem,"katalog");
xmlwriter_write_element($mem,"titel","Fever Pitch");
xmlwriter_write_element($mem,"autor","Hornby, Nick"); 
xmlwriter_end_element($mem);


 
Insgesamt sieht die Syntax folgendermaßen aus:

<?php
$mem = xmlwriter_open_memory();
if (false == $mem) { 
   die ("Der Speicher konnte nicht freigegeben werden.");
}
xmlwriter_start_document($mem,"1.1");
xmlwriter_start_element($mem,"katalog"); 
xmlwriter_write_element($mem,"titel","Fever Pitch");
xmlwriter_write_element($mem,"autor","Hornby, Nick");
xmlwriter_end_document($mem); 
$xml_data=xmlwriter_output_memory($mem); 
file_put_contents("katalog.xml",$xml_data);
?>


Die Ausgabe im Browser, wenn dort das Dokument katalog.xml geöffnet wird, stellt sich folgendermaßen dar:

Bilder



 

Attribute einfügen

Bislang wurden lediglich "normale" Elemente angelegt. Was momentan noch fehlt, sind die Attribute. Diese lassen sich denkbar einfach einfügen. XMLWriter stellt dafür die Funktion xmlwriter_write_attribute() zur Verfügung. Werft zunächst einen Blick auf das Ergebnis:

Bilder



Dem Element buch wurde das Attribut isbn mit einer Nummer als Wert zugewiesen. Die XML-Syntax sieht folgendermaßen aus:

<?xml version="1.1"?>
<katalog>
  <buch isbn="132342340">
    <titel>Fever Pitch</titel>
    <autor>Hornby, Nick</autor>
  </buch>
</katalog>


Attribute lassen sich über die Funktion xmlwriter_write_attribute() einfügen. Dieser Funktion übergibt man die XML-Ressource, den Attributnamen und den Wert des Attributs.

<?php
$mem = xmlwriter_open_memory(); 
if (false == $mem) { 
   die ("Der Speicher konnte nicht freigegeben werden."); 
} 
xmlwriter_start_document($mem,"1.1");
xmlwriter_start_element($mem,"katalog");
xmlwriter_start_element($mem,"buch"); 
xmlwriter_write_attribute($mem, "isbn", "132342340"); 
xmlwriter_write_element($mem,"titel","Fever Pitch"); 


xmlwriter_write_element($mem,"autor","Hornby, Nick"); xmlwriter_end_element($mem); xmlwriter_end_element($mem); xmlwriter_end_document($mem); $xml_data=xmlwriter_output_memory($mem); file_put_contents('attribute.xml',$xml_data); ?>


Kommentare einfügen

Der Übersichtlichkeit halber sollten in die XML-Dokumente – natürlich immer in Abhängigkeit von deren Umfang – Kommentare eingefügt werden. Dafür gibt es die Funktion xmlwriter_write_comment(). Zunächst ein Blick darauf, wie ein solcher Kommentar im XML-Dokument überhaupt aussieht.

<?xml version="1.1"?>
  <katalog>
    <buch>
      <!--Das ist das erste Buch-Element-->
      <titel>Fever Pitch</titel>
      <autor>Hornby, Nick</autor>
    </buch>
  </katalog>


Eingeleitet werden die Kommentare also über die Zeichenkette <!--. Beendet werden sie mit -->.

xmlwriter_write_comment($mem,"Das ist das erste Buch-Element");
xmlwriter_write_attribute($mem, "isbn", "132342340"); 
xmlwriter_write_element($mem,"titel","Fever Pitch");


 
xmlwriter_write_comment() schreibt einen vollständigen Kommentar ins Dokument.

Bilder


Nun kann es aber natürlich sein, dass ihr beispielsweise ganze Elemente auskommentieren wollt.

<?xml version="1.1"?>
  <katalog>
    <buch>
      <!--<titel>Fever Pitch</titel>-->
      <autor>Hornby, Nick</autor>
    </buch>
  </katalog>


 
In diesem Fall wird das Element titel ignoriert. Umsetzen lässt sich so etwas über die beiden Funktionen xmlwriter_start_comment() und xmlwriter_end_comment().

xmlwriter_start_comment($mem);
xmlwriter_write_attribute($mem, "isbn", "132342340"); 
xmlwriter_write_element($mem,"titel","Fever Pitch"); 
xmlwriter_end_comment($mem);


Auf diese Weise lassen sich ganze Passagen des XML-Dokuments bei Bedarf auskommentieren.

Bilder

 

DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von franzg
  • 14.05.2017 - 02:58

Super, vielen Dank!

Portrait von mario_P
  • 07.10.2016 - 13:06

Danke tolles Video !

Portrait von dmtw2107
  • 16.11.2013 - 09:50

verständlich und toll erklärt danke für das tutorial

Portrait von tampen
  • 30.10.2012 - 14:48

auch dieser Teil gut gemacht...

x
×
×