XML-Datei mit PHP erstellen
PHP bietet uns Programmierern so einige Möglichkeiten dynamisch eine XML Datei zu erstellen. Je nachdem welchen Zweck man verfolgt kann man schon mit einfachen Schleifen und echo-Befehlen sehr schnell ein valides und wohlgeformtes XML ausgeben. Bei einer großen Anzahl an Knoten (Nodes) kann es dann sehr schnell in lange String-Ketten ausarten. Beim Programmieren möchte man jedoch möglichst saubere und leicht nachzuvollziehbare Strukturen und dazu bietet sich in diesem speziellen Fall seit PHP 5 sehr gut die DOM Extension an. Diese spezielle Extension erlaubt Operationen an XML Dokumenten durch die DOM-API mit PHP 5.
In diesem Tutorial möchte ich erklären, wie schnell man ein valides XML-File anlegen und ausgeben kann. Zuerst möchte ich mit dem Inhalt der XML beginnen, den wir als Ziel mit PHP zusammenstellen möchten. Die Struktur ist sehr einfach gehalten, genügt aber vollkommen, um die Grundlagen zu verdeutlichen.
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="utf-8"?> <Liste> <Webseite id="1" kategorie="123"> <Titel>PHP Tutorials</Titel> </Webseite> <Webseite id="2" kategorie="456"> <Titel>XML dynamisch generieren</Titel> </Webseite> </Liste> |
Wie man an dem Inhalt gleich erkennt, haben wir einen Wurzelknoten (Root) Liste. In diesem befinden sich 2 Kindelemente Webseite. Das Element Webseite hat jeweils die beiden Attribute id und kategorie sowie ein Kindelement Titel. Das Element Titel hat schließlich einen Textknoten (Textnode) als Inhalt.
Nun kommen wir zum PHP Code, welcher uns auf überschaubare und leicht verständliche Weise (OOP) dieses XML erzeugen wird. Zuerst einmal legen wir ein neues Dokument der Klasse DOMDocument an. Im Konstruktur geben wir mit dem ersten Parameter „1.0“ die XML-Version, im zweiten das Encoding an. In unserem Fall nehmen wir UTF-8:
1 |
$dom = new DOMDocument('1.0', 'utf-8'); |
Anschließend legen wir im Dokument den Wurzelknoten Liste wie im oberen Beispiel an. Mit createElement wird dieser zuerst im DOM (Document Object Model) angelegt. Mit dem zweiten Befehl appendChild hängen wir diesen ersten Node an das DOM somit als Root (Wurzel) an.
1 2 |
$root = $dom->createElement('Liste'); $dom->appendChild($root); |
Nun brauchen wir zwei Elemente mit dem Namen Webseite. Dazu kreieren wir wie bereits die Wurzel die Kindelemente. Jeder Knoten bekommt dann zwei Attribute sowie ein Kindelement mit einem Textknoten als Inhalt.
1 2 3 4 5 6 7 8 9 |
$root->appendChild($firstNode = $dom->createElement("Webseite")); $firstNode->setAttribute("id", "1"); $firstNode->setAttribute("kategorie", "123"); $firstNode->appendChild($dom->createElement("Titel", "PHP Tutorials")); $root->appendChild($secondNode = $dom->createElement("Webseite")); $secondNode->setAttribute("id", "2"); $secondNode->setAttribute("kategorie", "456"); $secondNode->appendChild($dom->createElement("Titel", "XML dynamisch generieren")); |
Wir sind fast am Ziel angekommen. Jetzt fehlt nur noch die Ausgabe des PHP Files als richtiges XML im Browser. Dazu setzen wir den Header Content-Type auf text/xml und geben das fertige Dokument mit saveXML aus.
1 2 |
header('Content-type: text/xml; charset=utf-8'); echo $dom->saveXML(); |
So schnell kann man ein wohlgeformtes XML-Dokument anlegen. Zusammenfassend noch der komplette Code in diesem Tutorial. Viel Spaß und schnelles Gelingen. Ich hoffe, dass diese Anleitung eine Hilfe war.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $dom = new DOMDocument('1.0', 'utf-8'); $root = $dom->createElement('Liste'); $dom->appendChild($root); $root->appendChild($firstNode = $dom->createElement("Webseite")); $firstNode->setAttribute("id", "1"); $firstNode->setAttribute("kategorie", "123"); $firstNode->appendChild($dom->createElement("Titel", "PHP Tutorials")); $root->appendChild($secondNode = $dom->createElement("Webseite")); $secondNode->setAttribute("id", "2"); $secondNode->setAttribute("kategorie", "456"); $secondNode->appendChild($dom->createElement("Titel", "XML dynamisch generieren")); header('Content-type: text/xml; charset=utf-8'); echo $dom->saveXML(); ?> |
Du hast da ein paar Schreibfehler:
$root->appendChild($firstNode) = $dom->createElement(„Webseite“);
Hier fehlte noch eine Schließende Klammer hinter $firstNode
$firstNode->setAttribute(„id“, „1“);
Hier musste hinter id das ‚ durch ein “ ersetzt werden (zeri mal!)
Vielleicht korrigierst du das noch, für alle Freunde des Copy-Paste
Ansonsten ein schönes Tutti, leicht zu verstehen, gut geschrieben 😀
Hi dorr Baume, danke für den Hinweis. Habe es für die Copy & Paste – Freunde behoben. 😉
hallo
danke für das tut.
eine frage habe ich noch.
wie füge ich folgenden iframe hinzu?
<![CDATA[]]>
danke
Hallo eduard,
wenn Du mit IFrame einen CDATA-Knoten meinst, dann sollte zum Beispiel folgendes funktionieren:
Viel Erfolg.
@Peter
genau das habe ich gemeint. vielen dank
wie gebe ich diesen CDATA Knoten innerhalb element aus?
Du musst den CDATA-Knoten einem Knoten mit appendChild zuweisen (siehe mein Beispiel zuvor).
Hallo!
Das sieht sehr einfach aus, aber ich brings nicht zum Laufen… 🙁 Ich habe schon die ‚ durch “ ersetzt, mit save(filename) getestet, aber nichts. Wo ist mein Denk- (oder Tipp-) Fehler? Ich habe mich bis dato überhaupt noch nicht mit xml beschäftigt, von daher ist es sehr wahrscheinlich, dass ich den Wald vor lauter Bäumen nicht sehe…. Hier mal mein Code-Schnipsel:
[php]
$heute=$date();
$dom = new DOMDocument(„1.0″,“utf-8“);
$root = $dom->createElement(„LINKLISTE“);
$dom->appendChild($root);
$root->appendChild($firstNode) = $dom->createElement(„STATUS“);
$firstNode->appendChild($dom->createElement(„CODE“, „0“));
$firstNode->appendChild($dom->createElement(„MELDUNG“, „OK“));
$root->appendChild($secondNode) = $dom->createElement(„LINK“);
$secondNode->appendChild($dom->createElement(„BESCHREIBUNG“, „Datanormartikel“));
$secondNode->appendChild($dom->createElement(„URL“, $file_dn));
$secondNode->appendChild($dom->createElement(„AUTHENTIFIZIERUNGSMETHODE“, „HTTPAUTH“));
$secondNode->appendChild($dom->createElement(„DATENDATUM“, $heute));
$root->appendChild($thirdNode) = $dom->createElement(„LINK“);
$thirdNode->appendChild($dom->createElement(„BESCHREIBUNG“, „Datanormrabatte“));
$thirdNode->appendChild($dom->createElement(„URL“, $file_dr));
$thirdNode->appendChild($dom->createElement(„AUTHENTIFIZIERUNGSMETHODE“, „HTTPAUTH“));
$thirdNode->appendChild($dom->createElement(„DATENDATUM“, $heute));
header(„Content-type: text/xml“);
echo $dom->saveXML();
echo $dom->save(„test.xml“);
[php]
Vielen Dank für eure Hilfe!
Andrea
Genau das was mir gefehlt hat 🙂
Hallo Andrea
Ich weiss zwar nicht, ob du dein Problem schon lösen konntest, aber ich habe mit etwas rumprobieren deinen code zum laufen gebracht.
[php]
$heute=$date();
$dom = new DOMDocument(„1.0″,“utf-8“);
$root = $dom->createElement(„LINKLISTE“);
$dom->appendChild($root);
$root->appendChild($firstNode = $dom->createElement(„STATUS“));
$firstNode->appendChild($dom->createElement(„CODE“, „0“));
$firstNode->appendChild($dom->createElement(„MELDUNG“, „OK“));
$root->appendChild($secondNode = $dom->createElement(„LINK“));
$secondNode->appendChild($dom->createElement(„BESCHREIBUNG“, „Datanormartikel“));
$secondNode->appendChild($dom->createElement(„URL“, $file_dn));
$secondNode->appendChild($dom->createElement(„AUTHENTIFIZIERUNGSMETHODE“, „HTTPAUTH“));
$secondNode->appendChild($dom->createElement(„DATENDATUM“, $heute));
$root->appendChild($thirdNode = $dom->createElement(„LINK“));
$thirdNode->appendChild($dom->createElement(„BESCHREIBUNG“, „Datanormrabatte“));
$thirdNode->appendChild($dom->createElement(„URL“, $file_dr));
$thirdNode->appendChild($dom->createElement(„AUTHENTIFIZIERUNGSMETHODE“, „HTTPAUTH“));
$thirdNode->appendChild($dom->createElement(„DATENDATUM“, $heute));
header(„Content-type: text/xml“);
echo $dom->saveXML();
[php]
Das war ja einfach. Danke!
Hallo,
danke für das Tut.
Konnte alles gut umsetzen.
Habe noch folgenden Klemmer:
hier mein Ansatz
[php]
$year1 = date(„Y“);
$year2 = $year1+1;
$year3 = $year1+2;
$dom = new DOMDocument(‚1.0‘, ‚utf-8‘);
$root = $dom->createElement(‚units‘);
$unitownerid = ‚123456‘;
$internalunitid = ‚2213‘;
$jahr1 = ‚AAAAAOOOOOOAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAA‘;
$jahr2 = ‚BBBBBBBBBBBBBBBBBBBOOOOOOBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBBBBBBB‘;
$jahr3 = ‚AAAAAAAAAAAAOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAAAAAOOBBBBBBBBBBAAAA‘;
$element1 = array( $year1 => $jahr1);
$element2 = array( $year2 => $jahr2);
$element3 = array( $year3 => $jahr3);
$dom->appendChild($root);
$root->appendChild($firstNode = $dom->createElement(„unit“));
$firstNode->setAttribute(„container“, „availability“);
$firstNode->setAttribute(„internalunitid2“, „“);
$firstNode->setAttribute(„internalunitid“, $internalunitid);
$firstNode->setAttribute(„unitownerid“, $unitownerid);
$firstNode->appendChild($firstNode = $dom->createElement(„availability_year“));
foreach ($element1 as $value1 => $jahr1) {
$firstNode->appendChild($firstNode = $dom->createElement(„availability“));
$firstNode->setAttribute(„start“, $jahr1);
$firstNode->setAttribute(„year“, $value1);
}
foreach ($element2 as $value2 => $jahr2) {
$firstNode->appendChild($firstNode = $dom->createElement(„availability“));
$firstNode->setAttribute(„start“, $jahr2);
$firstNode->setAttribute(„year“, $value2);
}
foreach ($element3 as $value3 => $jahr3) {
$firstNode->appendChild($firstNode = $dom->createElement(„availability“));
$firstNode->setAttribute(„start“, $jahr3);
$firstNode->setAttribute(„year“, $value3);
}
header(‚Content-type: text/xml; utf-8‘);
echo $dom->saveXML();
//echo $dom->save(„availability.xml“);
[php]
Egebnis:
–
–
–
–
–
so sollte die XML eigendlich aussehen
–
–
–
Wer hat eine Lösung.
Danke