# SimpleXML: Suche nach Attribute und ändere Attribute



## Charriu (3. August 2010)

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):


```
<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


----------



## Sven Mintel (3. August 2010)

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


```
<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 


```
$Knoten['Attribut']="Wert";
```
 ein Attribut ändern


----------



## Charriu (3. August 2010)

Hallo Sven,
Schon einmal vielen Dank für deine Antwort. Hier mal meine Datei "save.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


----------



## Sven Mintel (3. August 2010)

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

Ändere das Setzen des Attributes, 
alt:

```
$attrNode = $elem->item(0);
$attrNode[$attr]=$value;
```

neu:

```
// 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


----------

