使用SimpleXmlElement删除xml节点

时间:2013-10-26 11:56:16

标签: php xml

我正在尝试使用SimpleXmlElement删除XML节点。

但是在运行此代码后,XML文件没有变化。它应该有效,但unset不会对文件进行任何更改:

$xml   = new SimpleXMLElement('goods.xml', NULL, TRUE);
$items = $xml->xpath('/items/item');
for ($i =0; $i < sizeof($items); $i++)
{
    if ($items[$i]->qty == 0 and $items[$i]->qtyonhold == 0)
    {
        $index = $i;
    }
}

$index = $index + 1;

var_dump($items[$index]);
unset($items[$index]);

$xml->asXML("goods.xml");

2 个答案:

答案 0 :(得分:3)

您将项目xpath分配给$ items变量。您正确地从那里删除索引,但您正在显示$ xml变量。 $ items就像是$ xml对象的xpath的副本。实际上你需要从$ xml变量本身中删除该索引。

我刚刚在这个平台上找到了一个很好的解释解决方案:https://stackoverflow.com/a/262556/2922852

答案 1 :(得分:2)

使用

unset($items[$index][0]);

有一个very good explanation on why this is working this way on SO by hakre,请查看。

除此之外,您可以简化代码并只需3行即可完成所有操作:

$xml = simplexml_load_string($x); // assume XML in $x
$items = $xml->xpath("/items/item[qty='0' and qtyonhold='0']");
foreach ($items as $item) unset($item[0]);
  • xpath选择其子<item>0
  • 中同时包含<qty>的所有<qtyonhold>个节点
  • 使用$items遍历数组foreach并使用上面解释的unset语法。

看到它有效:http://codepad.viper-7.com/Hae4vY