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>