DOMDocument und removeChild mit item()
Richard
- php
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
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
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
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; }
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
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
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