SimpleXML删除节点

时间:2013-06-19 08:04:15

标签: php xml simplexml

我有一个只运行一次的foreach循环,它让我感到难过。

1:我加载了一系列状态值(“请求”,“删除”或“已购买”)

2:然后我加载一个xml文件,需要循环“代码”节点并更新它们的状态,但是如果新代码是“删除”我想删除它,然后再转移到下一个

XML结构是......

<content>
.... lots of stuff
<codes>
<code date="xxx" status="request">xxxxx</code>
.. repeat ...
</codes>
</content>

和php代码是......

$newstatus = $_POST['updates'];
$file = '../apps/templates/'.$folder.'/layout.xml';
$xml2 = simplexml_load_file($file);
foreach($xml2->codes->code as $code){
    if($code['status'] == "delete") {
        $dom=dom_import_simplexml($code);
        $dom->parentNode->removeChild($dom);
    }
}
$xml2->asXml($file);

我暂时删除了更新,因此我可以调试删除检查。 这一切都有效,但它只删除第一个删除并留下所有其他删除,即使它是一个foreach循环? 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:13)

在同一次迭代中多次删除是不稳定的。例如。如果删除第二个元素,则第三个元素成为第二个元素,依此类推。

您可以先将要删除的元素存储到数组中来阻止这种情况:

$elementsToRemove = array();
foreach ($xml2->codes->code as $code) {
    if ($code['status'] == "delete") {
        $elementsToRemove[] = $code;
    }
}

然后在迭代它的同时删除基于数组的元素:

foreach ($elementsToRemove as $code) {
    unset($code[0]);
}

您还可以将if条件放入xpath查询中,该查询会直接返回数组(有关示例,请参阅the duplicate question)或使用iterator_to_array()