SimpleXML: Suche nach Attribute und ändere Attribute

Charriu

Mitglied
Hallo,
Ich stehe leider mal wieder voll auf dem Schlauch und alles Googeln hat nichts geholfen. Also ich habe eine XML-Datei, sie sieht so aus (stark vereinfacht):

Code:
<datenbank Id="1">
  <fragebogen Id="fb1" Name="blabla" Text="blabla">
    <topic Id="to1" Name="blablubb"></topic>
    <topic Id="to2"Name="blablubb"></topic>
  </fragebogen>
</dtaenbank>

Und jetzt möchte ich das Element raussuchen, dass die Id=fb1 hat und in diesem Element möchte ich danach zum Beispiel das Attribute Name ändern. Aber irgendwie komme ich da nicht hin wo ich hin will.

Die Beispiele im Internet zu SimpleXML versteh ich irgendwie nicht, zumal sie nie das Problem in Kombination zeigen. Entweder sie zeigen Attribute an, oder sie ändernd en Inhalt zwischen den Tags, aber keine Attribute.
Wäre natürlich auch schön, wenn ich dann überall mit der Id etwas suchen und ändern könnte. Dann bräuchte es nur ein Skript für Fragebögen und Topics.

Vielen Dank,
Felix
 
Moin,
hier mal ein funktionierendes Beispiel dafür mit beiden Dingen:

Code:
<pre><?php
$string = <<<XML
<datenbank Id="x1">
  <fragebogen Id="fb1" Name="blabla" Text="blabla">
    <topic Id="to1" Name="blablubb"></topic>
    <topic Id="to2" Name="blablubb"></topic>
  </fragebogen>
</datenbank>
XML;

$xml = new SimpleXMLElement($string);

//Fragebogen anhand Id suchen
$result = $xml->xpath("fragebogen[@Id='fb1']");

while(list( , $node) = each($result)) {
    //Name-Attribut ändern
    $node['Name']='Blubbbla';
}

//Test obs geändert wurde
echo htmlentities($xml->asXML());
?>
  • per xpath() kannst du das/die Element(e) anhand eines XPath-Pfades selektieren
  • mit
Code:
$Knoten['Attribut']="Wert";
ein Attribut ändern
 
Hallo Sven,
Schon einmal vielen Dank für deine Antwort. Hier mal meine Datei "save.php":

PHP:
<?php 
// Collect POST data
$parentId = $_POST['parentID'];
$attr = $_POST['attr'];
$value = $_POST['value'];

// Search tags for the given id
$frageboegen = new DOMDocument();
$frageboegen->load("../siob2010.xml");
$xpath = new DOMXPath($frageboegen);
$elem = $xpath->query('//*[@Id="'.$parentId.'"]');

// Change the value of the node
$attrNode = $elem->item(0);
$attrNode[$attr]=$value;

// Save the XML
echo $frageboegen->save("../siob2010.xml");
?>

Die POST-Variablen kommen alle korrekt an. Nun möchte ich also in parentId=fb1 das Attribute "Beschreibung" ändern (attr=Beschreibung) und zwar in value=bla. Das Skript läuft auch durch, allerdings hat er nichts geändert, die XML-Datei sieht aus wie vorher. Ich muss das leider so dynamisch machen, weil es gibt frageboegen, fragebogen, topics, fragen, antwortoptionen und jedes davon mit einem unterschiedlich großen Satz von Attributen. Daher dachte ich mir, wenn ich die Id des Elementes habe und das Attribute welches ich ändern will, dann sollte das nicht so schwierig sein.

Hab deinen Code probiert, aber da gibt es beim erzeugen des SimpleXMLDocuments einen Fehler. Irgendetwas mit den Klammern erwartet er anders, leider ist die XML vom Dozenten und ich darf da nichts rumbasteln.

Danke,
Felix
 
Da gehts jetzt ein bissl durcheinander, weil du jetzt DOMDocument verwendest.

Ändere das Setzen des Attributes,
alt:
Code:
$attrNode = $elem->item(0);
$attrNode[$attr]=$value;

neu:
Code:
// Change the value of the node
$elem->item(0)->setAttribute($attr,$value);

...aktiviere mal während der Entwicklung das error_reporting, das hätte dir eine betreffende Fehlermeldung ausgegeben :)
 
Zurück