[SimpleXML] Fehler beim Hinzufügen eines neuen Nodes

Thomas D

Erfahrenes Mitglied
Hallo!

Ich möchte mittels SimpleXML einem bestehenden XML-Tree ein Objekt hinzufügen. Dabei habe ich folgenden Code:

Code:
$parent = $xml->xpath ("/root/aktuelles");
echo $parent[0]->asXML(); //Probeausgabe - XPath-Lokalisation erfolgreich

$child = new SimpleXMLElement("<contObj></contObj>");
$child->addAttribute("id", getInsertId ($xml));
$child->addChild("headline", $_POST["headline"]);
$child->addChild("text", "<![CDATA[ " .$_POST["text"] ." ]]>");

$parent->appendChild ($child); //hier passiert der Fehler

Hier bekomme ich folgenden Fehler:

Fatal error: Call to a member function appendChild() on a non-object

Wenn ich dasselbe auf $parent[0] anwende (was IMO die logischere Variante wäre), dann kriege ich die folgende Fehlermeldung:

Fatal error: Call to undefined method SimpleXMLElement::appendChild()

Was mache ich nur falsch :confused:

MfG, Thomas D.
 
Die SimpleXMLElement->xpath()-Methode liefert ein Array von SimpleXMLElement-Objekten zurück und kein SimpleXMLElement-Objekt. Warum allerdings letzteres auch nicht funktioniert, verstehe ich nicht.

Genau, das mit dem Array ist mir ja auch aufgefallen und habe dann $parent[0] genommen, welches in der Probeausgabe auch ein XML-Element liefert. Nur warum hier die Methode appendChild() für SimleXMLElement unbekannt ist, weiß ich auch nicht. Kann es sein, dass es eine andere Methode gibt, die nur anders heißt?
 
Hier hast mal ein Beispiel wie man die Arraywerte bei simplexml ändern kann.

PHP:
$xml= simplexml_load_file('Dateiname.xml'); // Xml File einlesen
$xml->Spielername[1]->Nick='Simon';    // Ändert im 2 element bei Spielername das unter Element Nick auf den Wert Simon
echo ($xml->asXML() ) ;  // Änderung gleich am Bildschirm ausgeben

Wenn man net genau weiß wo was drin steht dann kann man dazu eine ganz einfach foreach Schleife verwenden.

Mfg Splasch
 
Hallo!

Das Problem bei mir ist, dass die Auswahl dynamisch ist:

Code:
$parent = $xml->xpath ("/root/" .strtolower ($_POST["auswahl"]));

Somit kann ich nicht mit $xml->aktuelles[0] drauf zugreifen, da es auch ein $xml->partner[0], $xml->projekte[0] usw. gibt. Dies könnte ich natürlich über eine foreach-Schleife mit if-Anweisung lösen, allerdings ist XMLQuery IMO schöner.

Außerdem geht's mir ja nicht darum, die Array-Werte zu ändern, sondern einen neuen Node hinzuzufügen, was ich wie in JavaScript-DOM mit appendChild() machen möchte. Meine Frage bezieht sich also darauf, wie ich dieses appendChild() korrekt anwende.

MfG, Thomas D.
 
Außerdem geht's mir ja nicht darum, die Array-Werte zu ändern, sondern einen neuen Node hinzuzufügen, was ich wie in JavaScript-DOM mit appendChild() machen möchte. Meine Frage bezieht sich also darauf, wie ich dieses appendChild() korrekt anwende

Genau das geht nur mit Dom elementen. Den bei simplexml gibt es soweit ich weiß keine appendChild funktion /objekt

Siehe dazu:
http://us2.php.net/simplexml

Was du machen willst mit appendChild() geht bei Dom objekten.
PHP:
$dom=new DOMDocument();
$dom->load('dateiname.xml');

Mfg Splasch
 
Zuletzt bearbeitet:
Wenn du neue Kind element hinzufügen willst dann siehe dir Beispiel 9 an.

Zitat aus Quelle:
PHP:
<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

$character = $xml->movie[0]->characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $xml->movie[0]->addChild('rating', 'PG');
$rating->addAttribute('type', 'mpaa');

echo $xml->asXML();
?>
Ende Zitat:


Andere Möglichkeiten auser die auf der Seite erwähnt werden sind mir nicht bekannt.

Mfg Splasch
 
Zuletzt bearbeitet:
Zurück