XML in PHP mit SimpleXML
Folgende Funktionen sind so zusammengestellt, dass man auf einfache Weise einen Wert aus einer XML-Datei auslesen, verändern oder löschen kann. Hierbei wird auf die PHP-Extension SimpleXML zurückgegriffen. Anhand Beispielen werden die einzelnen Funktionen erklärt. Die Anwendungen der Funktionen sollten selbsterklärend sein.
Zuerst die XML-Datei: datei.xml
<?xml version="1.0"?>
<liste>
<dino nummer="3">
<name>Velociraptor</name>
<ort>Asien</ort>
</dino>
<dino nummer="16">
<name>Triceratops</name>
<ort>Nordamerika</ort>
</dino>
</liste>
Vor der Verwendung muss die Datei geöffnet werden.
<?php
# Datei öffnen
function openXMLfile($xmlfile) {
if (!isset($GLOBALS['xmlObjects'][$xmlfile])) {
$xmlobj = simplexml_load_file($xmlfile);
$GLOBALS['xmlObjects'][$xmlfile] = $xmlobj;
}
}
?>
<?php
openXMLfile('datei.xml');
?>
Mithilfe der Funktion getXMLvalue()
können Werte aus der Datei ausgelesen werden.
<?php
# Wert auslesen
function getXMLvalue($xmlfile, $xmlpath) {
$xmlobj = $GLOBALS['xmlObjects'][$xmlfile]->xpath($xmlpath);
return ($xmlobj) ? $xmlobj[0] : false;
}
?>
<?php
echo getXMLvalue('datei.xml', '/liste/dino[@nummer="16"]/name');
# Ausgabe: Triceratops
?>
Mit changeXMLvalue()
wird ein Wert geändert.
<?php
# Wert ändern
function changeXMLvalue($xmlfile, $xmlpath, $xmlnode, $xmlvalue='') {
$xmlobj = $GLOBALS['xmlObjects'][$xmlfile]->xpath($xmlpath);
$xmlobj[0]->{$xmlnode} = htmlspecialchars($xmlvalue);
}
?>
<?php
changeXMLvalue('datei.xml', '/liste/dino[@nummer="3"]', 'ort', 'Mongolei');
?>
createXMLnode()
ermöglicht es, einen neuen Knoten im XML-Dokument zu erstellen.
<?php
# neuen Knoten hinzufügen
function createXMLnode($xmlfile, $xmlpath, $xmlnode, $attributes=array(), $text='') {
$xmlobj = $GLOBALS['xmlObjects'][$xmlfile]->xpath($xmlpath);
$xmlobj2 = $xmlobj[0]->addChild($xmlnode, htmlspecialchars($text));
foreach ($attributes as $attr => $value) {
$xmlobj2->addAttribute($attr, htmlspecialchars($value));
}
}
?>
<?php
createXMLnode('datei.xml', '/liste', 'dino', array('nummer'=>'21'));
createXMLnode('datei.xml', '/liste/dino[@nummer="21"]', 'name', array(), 'Tyrannosaurus');
createXMLnode('datei.xml', '/liste/dino[@nummer="21"]', 'ort', array(), 'Los Angeles');
?>
Mit Hilfe von getXMLvalue()
und unset()
kann ein Knoten gelöscht werden. Man beachte, dass mit
getXMLvalue()
auf das Elternelement des zu löschenden Knotens zugegriffen wird.
<?php
$parent = getXMLvalue('datei.xml', '/liste/dino[@nummer="16"]');
unset($parent->ort);
?>
Um ein Element mit einem bestimmten Attribut zu löschen, wird es ein bisschen komplizierter:
<?php
$nodes = getXMLvalue('datei.xml', '/liste');
foreach ($nodes as $node) {
if ((string)$node->attributes()->nummer == '16') {
unset($node[0]); # Knoten löschen, dessen Attribut "nummer" den Wert "16" hat
break;
}
}
?>
Ein Attribut an sich kann man wie folgt löschen:
<?php
$node = getXMLvalue('datei.xml', '/xpath/to/mynode');
unset($node->attributes()->myAttribute);
?>
Um die obigen Bearbeitungen der Datei speichern, kommt die Funktion saveXMLfile()
ins Spiel.
<?php
# XML-Datei speichern
function saveXMLfile($xmlfile) {
if (!isset($GLOBALS['xmlObjects'][$xmlfile])) {
trigger_error('Die Datei "'.$xmlfile.'" wurde nie geöffnet.');
return false;
}
$xmlFileValue = $GLOBALS['xmlObjects'][$xmlfile]->asXML();
file_put_contents($xmlfile, $xmlFileValue);
}
?>
<?php
saveXMLfile('datei.xml');
?>
Nach der obigen Prozedur würde die datei.xml sinngemäss so aussehen:
<?xml version="1.0"?>
<liste>
<dino nummer="3">
<name>Velociraptor</name>
<ort>Mongolei</ort>
</dino>
<dino nummer="21">
<name>Tyrannosaurus</name>
<ort>Los Angeles</ort>
</dino>
</liste>