Home > PHP > XML-Datei mit PHP erstellen

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.

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:

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.

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.

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.

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.

KategorienPHP Tags: , , , , ,
  1. 18. Januar 2013, 11:47 | #1

    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 😀

    • Peter
      18. Januar 2013, 12:09 | #2

      Hi dorr Baume, danke für den Hinweis. Habe es für die Copy & Paste – Freunde behoben. 😉

  2. eduard
    4. April 2013, 14:38 | #3

    hallo
    danke für das tut.
    eine frage habe ich noch.
    wie füge ich folgenden iframe hinzu?
    <![CDATA[]]>

    danke

    • Peter
      4. April 2013, 14:49 | #4

      Hallo eduard,

      wenn Du mit IFrame einen CDATA-Knoten meinst, dann sollte zum Beispiel folgendes funktionieren:

      Viel Erfolg.

  3. eduard
    4. April 2013, 15:15 | #5

    @Peter
    genau das habe ich gemeint. vielen dank
    wie gebe ich diesen CDATA Knoten innerhalb element aus?

    • Peter
      5. April 2013, 13:41 | #6

      Du musst den CDATA-Knoten einem Knoten mit appendChild zuweisen (siehe mein Beispiel zuvor).

  4. Andrea
    4. Februar 2015, 13:15 | #7

    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

  5. 19. Oktober 2015, 13:38 | #8

    Genau das was mir gefehlt hat 🙂

  6. xml_neuling
    13. Januar 2016, 10:55 | #9

    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]

  7. NoName
    26. Februar 2016, 17:23 | #10

    Das war ja einfach. Danke!

  8. Winfried
    28. Februar 2016, 17:02 | #11

    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

  9. Winfried
    28. Februar 2016, 17:31 | #12

    Winfried :[XML]-<units>
    -<unit unitownerid=”123456″ internalunitid=”2213″ internalunitid2=”” container=”availability”>
    -<availability_year>
    <availability year=”2016″ start=”AAAAAOOOOOOAAAAAAAAAAAAAAAAAAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAA” />
    <availability year=”2017″ start=”BBBBBBBBBBBBBBBBBBBOOOOOOBBBBBBBBBBBBBBBBBBBBBBBAAAABBBBBBBBBB” />
    <availability year=”2018″ start=”AAAAAAAAAAAAOOOOOOOOOOOOOOOOOOOOOAAAAAAAAAAAAAOOBBBBBBBBBBAAAA” />
    </availability_year>
    </unit>
    </units>
    [XML]

  1. Bisher keine Trackbacks