XML in PHP mit SimpleXML

September 2009

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');
?>

Mit Hilfe 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($xmlnodehtmlspecialchars($text));
  foreach(
$attributes as $attr => $value)
    
$xmlobj2->addAttribute($attrhtmlspecialchars($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>

Siehe auch:
 


Andere Einträge


Kommentare

#1
von Ben am 27.09.2010
Also ich hab das Beispiel indem man einen Wert verändern kann mal 1 zu 1 übernommen und wollte es dann so zurechtbiegen, dass es meinen bedürfniessen entspricht, bekomme aber immer die Fehlermeldung: "Fatal error: Call to a member function xpath() on a non-object in C:\xampp\htdocs\test\test.php on line 21"
kenn mich mit xml leider überhaupt nicht aus desshalb frag ich mal nach was damit gemeint ist.
mfg Ben

#2
von Horst Friedrich am 06.08.2015
Also ich bekomme bei dem Beispiel ein leeres Array zurück, obgleich der xpath Ausdruck "/liste/dino[@nummer="16"]/name" im Firepath (Xpath Editor) funktioniert. Das Problem scheint folgender Teil des Xpath Ausdrucks zu machen" "/name"
Kann da Jemand weiter helfen?