0

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

但是在我运行此代码后,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");
4

2 回答 2

3

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

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

于 2013-10-26T12:31:16.453 回答
2

采用

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

关于为什么在 SO 上以这种方式工作的原因有一个很好的解释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>-nodes 都0在他们的孩子<qty><qtyonhold>
  • $items使用上面解释foreach的- 语法循环遍历数组。unset

看到它工作:http ://codepad.viper-7.com/Hae4vY

于 2013-10-26T15:36:09.117 回答