您好我有这样的代码:
$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的第一个课程。你能建议一个解决方案吗?谢谢。
答案 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');