在php中使用foreach从xml文件中删除元素

时间:2012-03-25 13:21:57

标签: php xml

您好我有这样的代码:

$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');

我有一个xml文件:

<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>

在这段代码中,我试图删除具有iid指定的教师ID的元素。问题是必须删除具有此教师ID的所有课程。但在我的程序中,只删除了具有此iid的第一个课程。你能建议一个解决方案吗?谢谢。

1 个答案:

答案 0 :(得分:1)

getElementsByTagName()正在返回一个实时节点列表。如果在循环中从中删除元素,则循环将迭代不同于其开始的元素集,并且结果是不可预测的。相反,将要删除的节点存储在一个数组上,然后对其进行迭代并删除它们。

$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');