Werbung einblenden Werbung ausblenden


Home / Tutorials / xml, xsl, xpath Handbuch / DomXML und PHP


DomXML und PHP
Installation von domxml
Dom Funktionen zum Auslesen eines XML Dokumentes
Auf bestimmte Knoten zugreifen
Funktionen zum Modifizieren eines XML Dokumentes

DomXML und PHP

domxml ist eine Alternative zu xslt. Beide leisten in etwa dasselbe, wobei es mit xslt wohl einfacher ist, XML Dokumente auszulesen, und mit domxml ist es einfacher, diese zu verändern. Beide Ansätze werden sowohl von Perl als auch von PHP unterstützt.

Installation von domxml

Vorbemerkung: Manche Funktionen von domxml scheinen nur mit dem Apache zu funktionnieren. Um domxml laufen zu lassen, benötigt das Paket domxml.zip, welches man hier downloaden kann. Entzippt man selbiges, hat man drei Dateien, libxml2.dll, iconb.dll und php_domxml.dll. Die ersten beiden müssen in den Windows Ordner oder, unter Windows2000 in den Ordner system32. Die Datei php_domxml.dll muss in den Ordner extension von PHP. Weiter muss das Semikolon vor der Zeile extension=php_domxml.dll in der Datei php.ini entfernt werden. Danach muss der HTTP Server neu gestartet werden. Es scheint bei manchen Funktionen Probleme zu geben mit dem Sambar Server. Unter Umständen sattelt man also besser um auf den Apache. Alle Beispiele gehen von unten stehender XML Datei aus. Aus didaktischen Gründen wird auf eine DTD oder ein Schema verzichtet. Der domxml Parser würde die Seite im übrigen auch mit einer ungültigen DTD parsen. Bei nicht deklarierten Entities allerdings würde er einen Fehler melden und abbrechen.

<?xml version="1.0" encoding="ISO-8859-1"?>
<Projekte>
<Gruppe>
<Gruppenname stand="abgeschifft">Berliner Verwaltungsreform</Gruppenname>
<Kollegen>
<Mitarbeiter Firma="Preis Wasserhaus">Werner Lepinski</Mitarbeiter>
<Mitarbeiter>Erika Saufwech</Mitarbeiter>
<Mitarbeiter>Hans Geldfliech</Mitarbeiter>
</Kollegen>
<Ansprechpartner Telefon="030-435555" Ident="A_1">Otto Moltoimportante</Ansprechpartner>
<Adresse>
<Strasse Gegend="teures Pflaster">Kurfürstendamm 5</Strasse>
<Ort>13453 Berlin</Ort>
</Adresse>
<Budget>40 000000</Budget>
<Kommentar>Alles wird gut</Kommentar>
</Gruppe>
<Gruppe>
<Gruppenname>Hamburger Verwaltungschaos </Gruppenname>
<Kollegen>
<Mitarbeiter Firma="Artur der Kleine">Werner Nordflut</Mitarbeiter>
<Mitarbeiter>Marina Meimportauncarajo</Mitarbeiter>
<Mitarbeiter>Peter Wessnich</Mitarbeiter>
</Kollegen>
<Ansprechpartner Ident="A_2">Ludwig Noresponsable</Ansprechpartner>
<Adresse>
<Strasse>An der Waterkant 15</Strasse>
<Ort>45555 Hamburg</Ort>
</Adresse>
<Kostenvoranschlag>30 000000</Kostenvoranschlag>
</Gruppe>
<Team>
<Name>Controlling</Name>
<Ansprechpartner>Werner Kostfix</Ansprechpartner>
<Telefon>030-4544332</Telefon>
</Team>
</Projekte>

Dom Funktionen zum Auslesen eines XML Dokumentes

Zum Auslesen eines Dokumentes gibt es Alternativen zu domxml. Das hier beschriebenen zeigt lediglich die prinzipielle Vorgehensweise. Ermitteln des Wurzelknotens

<?
$objekt_dokument = domxml_open_file("c:/apache/htdocs/projekte.xml");
$objekt_wurzelknoten=$objekt_dokument->document_element();
$name_des_wurzelknoten=$objekt_wurzelknoten->node_name ( );
print $name_des_wurzelknoten."<br>";
?>

Wie deutlich zu sehen, ist der Zugriff objektorientiert und die einzelnen Funktionen lassen sich auch nur über entsprechende Objekte ansprechen. Hinsichtlich objektorientierte Programmierung in PHP siehe Handbuch PHP. Ansonsten ist dieser Schnipsel wohl selberklärend. Als Resultat des Programms erhält man Projekte.

Auf bestimmte Knoten zugreifen

Will man den Inhalt bestimmter Knoten haben, kann man das so machen.

<?
$dokument = domxml_open_file("c:/apache/htdocs/projekte.xml");
$meine_elemente = $dokument->get_elements_by_tagname("Mitarbeiter");
foreach ($meine_elemente as $knoten)
{
print $knoten->get_content()." <br>";
}
?>


Alle Attribute eines bestimmten Knotens auslesen

<?
$dokument = domxml_open_file("c:/apache/htdocs/projekte.xml");
$meine_elemente = $dokument->get_elements_by_tagname("Mitarbeiter");
foreach ($meine_elemente as $knoten)
{
$flag=$knoten->has_attributes();
if($flag)
{
print $knoten->get_attribute("Firma")." <br>";
}
}
?>

Wenn das obige XML Dokument zugrunde liegt, ist das Ergebnis Price Waterhouse Arthur de Little.

Funktionen zum Modifizieren eines XML Dokumentes

Will man dem Dokument oben in der zweiten Gruppe einen neuen Mitarbeiter spendieren, sieht das so aus.

<?
$dokument = domxml_open_file("c:/apache/htdocs/projekte.xml");
$meine_elemente = $dokument->get_elements_by_tagname("Mitarbeiter");
$neuer_Mitarbeiter=$dokument->create_element ("Mitarbeiter");
$neuer_Mitarbeiter->set_attribute("Firma","KBMC");
$neuer_Mitarbeiter->set_content("Mario Moreno Cantinflas");
$Gruppen = $dokument->get_elements_by_tagname("Gruppe");
$Gruppe = $Gruppen[1];
$Kinder_dieser_Gruppe=$Gruppe->child_nodes();
$Objekt_Kollegen=$Kinder_dieser_Gruppe[1];
$neuer_Mitarbeiter_eingestellt=$Objekt_Kollegen->append_child($neuer_Mitarbeiter);
$dokument->dump_file("c:/apache/htdocs/apfelkompott.xml", false, true);
print "Ein neuer Mitarbeiter wurde hinzugefügt";
?>

Wie unschwer zu erkennen, ist das kompliziert. Betrachten wir erstmal die Datei apfelkompott.xml, zu der der neue Mitarbeiter Mario Moreno Cantinflas hinzugefügt wurde und sprechen dann das Skript Zeile für Zeile durch.

<?xml version="1.0" encoding="ISO-8859-1"?>
<Projekte>
<Gruppe>
<Gruppenname stand="abgeschifft">Berliner Verwaltungsreform</Gruppenname>
<Kollegen>
<Mitarbeiter Firma="Preis Wasserhaus">Werner Lepinski</Mitarbeiter>
<Mitarbeiter>Erika Saufwech</Mitarbeiter>
<Mitarbeiter>Hans Geldfliech</Mitarbeiter>
</Kollegen>
<Ansprechpartner Telefon="030-435555" Ident="A_1">Otto Moltoimportante</Ansprechpartner>
<Adresse>
<Strasse Gegend="teures Pflaster">Kurfürstendamm 5</Strasse>
<Ort>13453 Berlin</Ort>
</Adresse>
<Budget>40 000000</Budget>
<Kommentar>No comment</Kommentar>
</Gruppe>
<Gruppe>
<Gruppenname>Hamburger Verwaltungschaos </Gruppenname>
<Kollegen>
<Mitarbeiter Firma="Artur der Kleine">Werner Nordflut</Mitarbeiter>
<Mitarbeiter>Marina Meimportauncarajo</Mitarbeiter>
<Mitarbeiter>Peter Wessnich</Mitarbeiter>
<Mitarbeiter Firma="KBMC">Mario Moreno Cantinflas</Mitarbeiter>
</Kollegen>
<Ansprechpartner Ident="A_2">Ludwig Noresponsable</Ansprechpartner>
<Adresse>
<Strasse>An der Waterkant 15</Strasse>
<Ort>45555 Hamburg</Ort>
</Adresse>
<Kostenvoranschlag>30 000000</Kostenvoranschlag>
</Gruppe>
<Team>
<Name>Controlling</Name>
<Bereich>Wir kontrollieren uns selber, das reicht</Bereich>
</Team>
</Projekte>

Wie deutlich zu erkennen, wurde ein neuer Mitarbeiter zur Firma KPMG gehörig mit dem Namen Mario Moreno Cantinflas dem XML Dokument hinzugefügt. Sprechen wir den Schnipsel Zeile für Zeile durch.

  <?
1.) $dokument = domxml_open_file("c:/apache/htdocs/projekte.xml");
2.)

$neuer_Mitarbeiter=$dokument->create_element ("Mitarbeiter");

3.) $neuer_Mitarbeiter->set_attribute("Firma","KBMC");
4.) $neuer_Mitarbeiter->set_content("Mario Moreno Cantinflas");
5.) $Gruppen = $dokument->get_elements_by_tagname("Gruppe");
6.) $Gruppe = $Gruppen[1];
7.) $Kinder_dieser_Gruppe=$Gruppe->child_nodes();
8.) $Objekt_Kollegen=$Kinder_dieser_Gruppe[1];
9.) $neuer_Mitarbeiter_eingestellt=$Objekt_Kollegen->append_child($neuer_Mitarbeiter);
10.) $dokument->dump_file("c:/apache/htdocs/apfelkompott.xml", false, true);
11.) print "Ein neuer Mitarbeiter wurde hinzugefügt";
  ?>

In Zeile 1) generieren wir ein neues Dokument Objekt. Die domxml Funktionen sind alle in Klassen gekapselt und lassen sich folglich auch nur über Instanzen dieser Klassen, also Objekte, ansprechen. In Zeile 2 bis 4 generieren wir ein neues Element und weisen diesem Element ein Attribut und einen Inhalt zu. Mit der Generierung eines Elementes haben wir noch nicht viel gewonnen, da wir es noch an die richtige Stelle, nämlich in der zweiten Gruppe als Kindobjekt von Kollegen einfügen müssen. Die Funktion append_child fügt das Dokument als Kindelement des Elementes ein, welches es als Parameter übergeben bekommt. Folglich brauchen wir ein Objekt des Elementes Kollegen, genau genommen des Elementes Kollegen in der zweiten Gruppe. In Zeile fünf bilden wir mit get_elements_by_tagname eine Array, der alle Elemente mit den Namen Gruppe als Objekte hält. Von diesen wiederum wollen wir das zweite Element haben. In der Zeile sechs wird ein Objekt generiert, das auf das zweite Element Gruppe verweist. Gruppe wiederum hat auch mehrere Kindknoten, wir brauchen aber den zweiten. Folglich fischen wir uns in Zeile 7 alle Kindknoten raus und bilden für den zweiten Knoten in der 8 Zeile ein Objekt. $Objekt_Kollegen ist als ein Objekt, dass auf den zweiten Knoten in der zweiten Gruppe verweist. Jetzt können wir append_child anwenden, da wir den Knoten, wo der neue Mitarbeiter eingefügt werden soll kennen. In Zeile 10 drucken wir das neue XML Dokument. Wie oben bereits dargestellt, enthält es den neuen Mitarbeiter.

vorhergehendes Kapitel