| 
DomXML
und PHP
Installation von domxml
Dom Funktionen zum Auslesen eines XML Dokumentes
Auf bestimmte Knoten zugreifen
Funktionen zum Modifizieren eines XML Dokumentes
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.
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.
|
 |