Richard: DOMDocument und removeChild mit item()

Hallo,

Warum erhalte ich bei folgendem Konstrukt einen "Not found Error", obwohl Testausgaben mit nodeValue das gewünschte Ergebnis liefern?

$doc = new DOMDocument();  
$doc->load( 'config.xml' );  
  
$items = $doc->getElementsByTagName('name');  
  
for ($i = 0; $i < $items->length; $i++) {  
   echo $doc->removeChild( $items->item( $i ) );  
}  
  
$doc->saveXML();

Es erscheint folgende Fehlermeldung:

Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in pfad/zum/script.php:37 Stack trace: #0 pfad/zum/script.php(37): DOMNode->removeChild(Object(DOMElement)) #1 {main} thrown in pfad/zum/script.php on line 37

Beste Grüße
Richard

--
Um Rekursion zu verstehen, muss man erstmal Rekursion verstehen.
~§%+
  1. hi,

    for ($i = 0; $i < $items->length; $i++) {
       echo $doc->removeChild( $items->item( $i ) );

    Berücksichtige, dass du mit jedem Entfernen eines Kindelementes $items->length um eins verringerst, und dass sich auch die Indices der verbleibenden Elemente entsprechend verringern.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo wahsaga,

      for ($i = 0; $i < $items->length; $i++) {
         echo $doc->removeChild( $items->item( $i ) );

      Berücksichtige, dass du mit jedem Entfernen eines Kindelementes $items->length um eins verringerst, und dass sich auch die Indices der verbleibenden Elemente entsprechend verringern.

      Wenn ich

      for ($i = 0; $i < $items->length; $i++) {  
         echo $doc->removeChild( $items->item( 0 ) );  
      }
      

      schreibe (also mit 0 anstatt $i), müsste doch immer das erste Element gelöscht werden. Und zwar nach meinem logischen Verständnis genau $items->length Mal. Oder wird $items->length beim zweiten Schleifendurchlauf dynamisch um eins verringert?

      Abgesehen davon - warum funktioniert denn folgendes nicht? (selber Fehler)

      $doc->removeChild( $doc->getElementsByTagName( 'name' )->item( 0 ) );

      Beste Grüße
      Richard

      --
      Um Rekursion zu verstehen, muss man erstmal Rekursion verstehen.
      ~§%+
      1. hi,

        Wenn ich

        for ($i = 0; $i < $items->length; $i++) {

        echo $doc->removeChild( $items->item( 0 ) );
        }

        
        > schreibe (also mit 0 anstatt $i), müsste doch immer das erste Element gelöscht werden. Und zwar nach meinem logischen Verständnis genau $items->length Mal. Oder wird $items->length beim zweiten Schleifendurchlauf dynamisch um eins verringert?  
          
        Natürlich. Solche NodeLists spiegeln immer den aktuellen DOM-Zustand wieder.  
          
        
        > Abgesehen davon - warum funktioniert denn folgendes nicht? (selber Fehler)  
        >   
        > `$doc->removeChild( $doc->getElementsByTagName( 'name' )->item( 0 ) );`{:.language-php}  
          
        Wie sieht denn das Objekt aus, auf welches du das anwendest?  
          
        gruß,  
        wahsaga  
          
        
        -- 
        /voodoo.css:  
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        
        1. Hallo wahsaga,

          $doc->removeChild( $doc->getElementsByTagName( 'name' )->item( 0 ) );

          Wie sieht denn das Objekt aus, auf welches du das anwendest?

          echo var_dump($doc->getElementsByTagName( 'name' ));

          ergibt

          object(DOMNodeList)#3 (0) { }.

          Im XML steht folgendes:

          <persons_names>  
            <name>herr sonstwer</name>  
            <name>frau huddeldi</name>  
            <name>mister cool</name>  
            <name>miss schneck</name>  
          </persons_names>
          

          Beste Grüße
          Richard

          --
          Um Rekursion zu verstehen, muss man erstmal Rekursion verstehen.
          ~§%+
          1. hi,

            echo var_dump($doc->getElementsByTagName( 'name' ));

            ergibt

            object(DOMNodeList)#3 (0) { }.

            Schon vor dem Entfernen der Knoten?
            Dann sind wohl gar keine drin.

            Was ergibt denn var_dump($doc)?

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Hallo wahsaga,

              Schon vor dem Entfernen der Knoten?
              Dann sind wohl gar keine drin.

              Was ergibt denn var_dump($doc)?

              Auch nur ein leeres DOMNodeList-Objekt. Allerdings liefter

              echo $doc->getElementsByTagName('name')->item(0)->nodeValue;

              das gwünschte Ergebnis "herr sonstwer".

              Beste Grüße
              Richard

              --
              Um Rekursion zu verstehen, muss man erstmal Rekursion verstehen.
              ~§%+