我正在尝试使用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");
答案 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
语法。