PHP-Fehler #8192: Function get_magic_quotes_gpc() is deprecated;
Datei: /home/floernco/public_html/webscriptingData/inc/prime.php;
Zeile: 61
XML in PHP mit SimpleXML .· PHP, XML .· Webscripting .· floern.com

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?