【问题标题】:deleting xml node using SimpleXmlElement使用 SimpleXmlElement 删除 xml 节点
【发布时间】:2013-11-05 13:10:38
【问题描述】:

我正在尝试使用 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");

【问题讨论】:

  • 为什么是$index = $index + 1;,如果永远找不到条件怎么办?查看您的代码然后会发生什么,您的代码中已经存在逻辑缺陷,无论您对确切使用哪种方法有一些技术知识。首先修复逻辑缺陷,它们通常会造成更大的伤害。
  • 您好,实际上这段代码只有在有匹配的 id 时才会被捕获。但是,是的,仍然应该检查。

标签: php xml


【解决方案1】:

使用

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 选择所有&lt;item&gt;-nodes 与0 在他们的孩子&lt;qty&gt;&lt;qtyonhold&gt;
  • 使用foreach 循环遍历数组$items 并使用上面解释的unset-语法。

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

【讨论】:

  • +1;谢谢鲜花; + 链接(假设您的意思是那个)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 2017-02-14
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    相关资源
    最近更新 更多