Christian.Sch.: Element in XML-Datei einfügen

Hallo Forum!

Ich hatte vor einigen Tagen ein Thema eröffnet wie ich eine XML Datei erstellen kann.
Leider ist das Thema mittlerweile verschwunden und auch im Archiv hab ich meinen Namen nicht mehr gefunden :(
Dank Hilfe hab ich das Erstellen der Datei mittlerweile geschafft.
Jetzt scheitere ich aber daran einen neuen Datensatz hinzu zu fügen.
Könnte sich bitte nochmal jemand den Code angucken und mir sagen wo mein Fehler ist?
Irgendwie benutze ich addChild() falsch vermute ich.

Datei gruppe_xml_list.php

  
'<?PHP  
$xmlstr = <<<XML  
<?xml version=\'1.0\' standalone=\'yes\' ?>  
<gruppe>  
 <person>  
  <name></name>  
  <geschlecht></geschlecht>  
  <alter></alter>  
  <groesse></groesse>  
  <gewicht></gewicht>  
 </person>  
</gruppe>  
XML;  
?>';  

Das Skript

  
# Lade die XML Datei  
  
include("gruppe_xml_list");  
$xml = new SimpleXMLElement($xmlstr);  
  
# Füge neue Person in Gruppe  
  
$newperson = $xml->gruppe->addChild('person');  
  
# Füge Angaben der neuen Person ein  
# Dieser Teil erzeugt den Fehler  
#  
# SimpleXMLElement::addChild()  
# [function.SimpleXMLElement-addChild]: Node no longer exists in (...)  
  
$newperson->addChild('name', 'Klaus']);  
$newperson->addChild('geschlecht', 'maennlich']);  

Was mache ich falsch bei der Verwendung vonn addChild?

Danke für eure Hilfe und noch einen schönen Sonntag!
Christian

  1. Hallo,

    $xml = new SimpleXMLElement($xmlstr);
    $newperson = $xml->gruppe->addChild('person');

    Wenn gruppe das Wurzelelement ist, dann ist $xml bereits eine Referenz auf dessen Knotenobjekt, oder nicht?

    Mathias

    1. Hallo Mathias!

      $xml = new SimpleXMLElement($xmlstr);
      $newperson = $xml->gruppe->addChild('person');

      Wenn gruppe das Wurzelelement ist, dann ist $xml bereits eine Referenz auf dessen Knotenobjekt, oder nicht?

      Danke, natürlich.
      Was passiert aber eigentlich wenn der Inhalt genauso ist wie das Ende des Elements?

      Also z.B.
      $name = '</name>';
      $foo = '<name>'.$name.'</name>';

      Danke!
      Christian

      1. Hallo,

        Was passiert aber eigentlich wenn der Inhalt genauso ist wie das Ende des Elements?

        Markup und Tags gibts nur auf der Ebene der XML-Serialisierung. Auf der DOM-Ebene, die auf Basis des geparsten Dokuments im Speicher operiert, hat man mit Markup nichts zu tun und braucht sich darüber auch keine Gedanken machen. Das ist der Sinn des DOM: Man hantiert nicht mit der Serialisierung, sondern dem Objektmodell.

        (SimpleXML ist nicht wirklich W3C DOM, aber zur Veranschaulichung werfe ich es mal durcheinander. Ich kann es gerade nicht ausprobieren, aber soweit ich mich erinnere, verhält sich SimpleXML so.)

        SimpleXML sieht den String als String an, benutzt ihn direkt als Textknoten und mehr nicht. Wenn du das XML wieder serialisierst wird dann z.B. <name>&lt;/name&gt;</name> oder <name><![CDATA[</name>]]></name> daraus. Der XML-Serializer nimmt einem also diese Arbeit ab.

        Mathias

        1. Hallo Mathias!

          SimpleXML sieht den String als String an, benutzt ihn direkt als Textknoten und mehr nicht. Wenn du das XML wieder serialisierst wird dann z.B. <name>&lt;/name&gt;</name> oder <name><![CDATA[</name>]]></name> daraus. Der XML-Serializer nimmt einem also diese Arbeit ab.

          Du hast recht, Danke!

          Christian