2012-03-25 9 views
1

Hallo, ich habe einen Code wie folgt aus:Löschen von Elementen aus XML-Datei mit foreach in php

$doc = new DOMDocument(); 
$doc->Load('courses.xml'); 
    foreach ($doc->getElementsByTagName('courses') as $tagcourses) 
    { 
     foreach ($tagcourses ->getElementsByTagName('course') as $tagcourse) 
     { 
     if(($tagcourse->getAttribute('instructorId')) == $iid){ 

      $tagcourses->removeChild($tagcourse); 
     } 
     } 
    } 
$doc->Save('courses.xml'); 

Und ich habe eine XML-Datei:

<courses> 
    <course courseId="1" instructorId="1"> 
    <course_code>456</course_code> 
    <course_name>bil</course_name> 
    </course> 
    <course courseId="2" instructorId="2"> 
    <course_code>234</course_code> 
    <course_name>math</course_name> 
    </course> 
    <course courseId="3" instructorId="2"> 
    <course_code>341</course_code> 
    <course_name>cs</course_name> 
    </course> 
    <course courseId="4" instructorId="2"> 
    <course_code>244</course_code> 
    <course_name>phyc</course_name> 
    </course> 
</courses> 

In diesem Code habe ich versucht, Elemente zu entfernen, die hat Lehrer-ID, die mit iid angegeben.Das Problem ist alle Kurse, die diese Instructor-ID entfernt werden muss.Aber in meinem Programm wird nur der erste Kurs, der diese iid hat entfernt.Kannst du eine Lösung vorschlagen? Danke.

Antwort

1

Die getElementsByTagName() gibt eine Live-Nodeliste zurück. Wenn Sie ein Element daraus in einer Schleife entfernen, durchläuft die Schleife dann eine andere Gruppe von Elementen als sie begonnen hat, und die Ergebnisse sind nicht vorhersagbar. Speichern Sie die Knoten, die Sie entfernen möchten, stattdessen in einem Array, durchlaufen Sie sie anschließend und entfernen Sie sie.

$doc = new DOMDocument(); 
$doc->Load('courses.xml'); 
$to_remove = array(); 

    foreach ($doc->getElementsByTagName('courses') as $tagcourses) 
    { 
     foreach ($tagcourses ->getElementsByTagName('course') as $tagcourse) 
     { 
     if(($tagcourse->getAttribute('instructorId')) == $iid){ 

      $to_remove[] = $tagcourse; 
     } 
     } 
    } 

    // Remove the nodes stored in your array 
    // by removing it from its parent 
    foreach ($to_remove as $node) 
    { 
     $node->parentNode->removeChild($node); 
    } 
$doc->Save('courses.xml'); 
+0

Vielen Dank für diese nützliche Antwort – Ozg

+0

@ozg Gern geschehen, glücklich zu helfen. –

Verwandte Themen