XML node löschen

luchs3

Erfahrenes Mitglied
Hi,
Ich habe ein XML Dokument, bei dem ich alle artikel- Knoten (samt Childnodes), die leer sind löschen.

Jetzt habe ich das auch schon so halb hinbekommen.
Halb leider nur, da er mir nur jeden 2. Knoten löscht. Ich habe keine Ahnung warum.

Wenn ich mir die Artikelknoten in der Schleife anzeigen lasse, kommen alle vor.
Es scheint so, als ob der Zeiger nach deleteNode() schon bei dem nächsten Knoten wäre.

deleteNode
PHP:
function deleteNode($node) {
    deleteChildren($node);
    $parent = $node->parentNode;
    $oldnode = $parent->removeChild($node);
}

function deleteChildren($node) {
    while (isset($node->firstChild)) {
        deleteChildren($node->firstChild);
        $node->removeChild($node->firstChild);
    }
}
PHP:
    $abfrage_cleaner = $abfrage->getElementsByTagName('artnr');

    foreach ($abfrage_cleaner as $abfrage_row)
    {

        $diff = $abfrage_row->getElementsByTagName('diff');
        $diff_empty = 0;
        
        foreach ($diff as $diff_row)
        {
            $diff_amount = $diff_row->getAttribute('amount');
            $diff_pices = $diff_row->getAttribute('pices');
            $diff_empty += $diff_amount + $diff_pices;
        }

        
        if ($diff_empty == 0)
        {
            deleteNode($abfrage_row);
        }
    }
 
Moin,

du hast dir die Frage eigentlich selbst beantwortet:
Es scheint so, als ob der Zeiger nach deleteNode() schon bei dem nächsten Knoten wäre.

Wenn du Knoten Nr.1 entfernst, ist der ehemals 2. Knoten die neue #1...diesen übergehst du somit.

Lösung: fange beim letzten Knoten an mit deiner Aktion.
 
hmmmm, schön und gut, dann sollte doch das funktionieren:

PHP:
    $ii = 0;
    foreach ($abfrage_cleaner as $abfrage_row)
    {
        $ii++;
        $diff = $abfrage_row->getElementsByTagName('diff');
        $diff_empty = 0;
        
        foreach ($diff as $diff_row)
        {
            $diff_amount = $diff_row->getAttribute('amount');
            $diff_pices = $diff_row->getAttribute('pices');
            $diff_empty += $diff_amount + $diff_pices;
        }

        if ($diff_empty == 0)
        {
            $ii--;
             deleteNode($abfrage_cleaner->item($ii));
        }
    }
tut es aber nicht.
wo hab ich da den Fehler?
 
Zurück