schnelle Erstellung von XML mit PHP


Das Verarbeiten von XML-Daten ist zwar prinzipiell sehr einfach, wenn man die Verarbeitung komplett mit dem DOM macht, aber trotzdem möchte ich hier und jetzt das Thema aufgreifen. In den späteren Artikeln meines Adventskalenders werde ich immer mal wieder serverseitiges Erzeugen und Verarbeiten von XML-Daten brauchen, weswegen hier die Basis gelegt werden soll.


Im Prinzip gibt es in PHP nur 3 wichtige DOM-Klassen:

  1. DOMDocument
  2. DOMElement
  3. DOMNode

Wobei

Um eine XML-Struktur von folgender Syntax zu schaffen, reicht ein relativ einfaches Script.

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mitarbeiter>
  3. <person nr="2007-12-15-RE">
  4. <nachname>Reinsdorf</nachname>
  5. <vorname>Enrico</vorname>
  6. <contacts>
  7. <email>enrico@re-design.de</email>
  8. <telefon type="mobil">
  9. <vorwahl>0177</vorwahl>
  10. <nummer>2822557</nummer>
  11. </telefon>
  12. </contacts>
  13. </person>
  14. <person nr="2007-04-01-MM">
  15. <nachname>Mustermann</nachname>
  16. <vorname>Max</vorname>
  17. <contacts>
  18. <email>max@mustermann.de</email>
  19. <telefon type="büro">
  20. <vorwahl>1234</vorwahl>
  21. <nummer>1234567</nummer>
  22. </telefon>
  23. </contact>
  24. </person>
  25. </mitarbeiter>

Diese XML-Datei beinhaltet 2 Personen mit den dazugehörigen Vor- und Zuname und den Kontaktmöglichkeiten per Email und per Telefon.

Hier nur das PHP-Script zum Erzeugen diese XML-Datenstruktur.

  1. <?php
  2. header('content-type: text/xml charset=utf-8');
  3. /* @var $dom DOMDocument */
  4. /* @var $mitarbeiter DOMElement */
  5. /* @var $person DOMElement */
  6. /* @var $contacts DOMElement */
  7. /* @var $telefon DOMElement */

Als erstes wird über die header-Funktion der richtige Inhaltstyp festgelegt, so dass die Browser auch die Sonderzeichen korrekt anzeigen können. Die weiteren Kommentare dienen nur meinem Zend-Studio zur Hilfe.

  1. $dom = new DOMDocument('1.0', 'utf-8');

Als nächste wird ein neues DOM-Dokument angelegt.

  1. $mitarbeiter = $dom->appendChild(new DOMElement('mitarbeiter'));

In dieses DOM-Objekt wird ein erster Knoten hineingelegt.

  1. $person = $mitarbeiter->appendChild(new DOMElement('person'));
  2. $person->setAttribute('id','2007-12-16-RE');
  3. $person->appendChild(new DOMElement('vorname','Enrico'));
  4. $person->appendChild(new DOMElement('nachname','Reinsdorf'));

Dann wird dem <mitarbeiter>-Knoten ein Unterknoten person hinzugefügt. Diesem Knoten wird ein Attribute und 2 Unterknoten mit direkten Texten zugewiesen.

  1. $contacts = $person->appendChild(new DOMElement('contacts'));
  2. $contacts->appendChild(new DOMElement('email','enrico@re-design.de'));
  3. $telefon = $contacts->appendChild(new DOMElement('telefon'));
  4. $telefon->setAttribute('type','mobil');
  5. $telefon->appendChild(new DOMElement('vorwahl','0177'));
  6. $telefon->appendChild(new DOMElement('nummer','2822557'));

Zum Schluss wird der <person>-Knoten mit dem Unterknoten contacts erweitert. Dieser erhält wiederum einem einfachen Unterknoten email und einem komplexen Unterknoten für die Telefonnummer.

  1. $person = $mitarbeiter->appendChild(new DOMElement('person'));
  2. $person->setAttribute('id','2007-04-01-MM');
  3. $person->appendChild(new DOMElement('vorname','Max'));
  4. $person->appendChild(new DOMElement('nachname','Mustermann'));
  5. $contacts = $person->appendChild(new DOMElement('contacts'));
  6. $contacts->appendChild(new DOMElement('email','max@mustermann.de'));
  7. $telefon = $contacts->appendChild(new DOMElement('telefon'));
  8. $telefon->setAttribute('type','büro');
  9. $telefon->appendChild(new DOMElement('vorwahl','1234'));
  10. $telefon->appendChild(new DOMElement('nummer','1234567'));

Das ganz nun nochmals für die 2. Person. In späteren Script wird natürlich diese Zusammenstellung über eine Schleife erstellt und nicht, wie ich es jetzt gemacht habe von Hand.

  1. echo $dom->saveXML();
  2. ?>

Als Abschluss gebe ich das DOM-Object als XML-Datenformat an den Browser aus.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.