1

无法从 XML 文档中删除所有子项

<?xml version="1.0" encoding="UTF-8"?>
    <routes>
      <route name="admin" />
      <!---->
      <route name="blog" bla bla/>
      <route name="blog" bla bla/>
      <route name="blog" bla bla/>
    </routes>

$xml = simplexml_load_file('routes.xml');

$dom_sxe = dom_import_simplexml($xml); $dom = new \DOMDocument('1.0'); $dom_sxe = $dom->importNode($dom_sxe, true); $dom_sxe = $dom->appendChild($dom_sxe); foreach ($dom->getElementsByTagName('route') as $route) { if($route->getAttribute('name') === 'blog') { $route->parentNode->removeChild($route); echo $route->getAttribute('name'); } } echo $dom->saveXML();

仅删除具有属性blog的 2 个元素

4

1 回答 1

1

问题是您在循环遍历文档时正在修改文档 - 有点像在foreach循环中间修改数组。

请注意,$dom->getElementsByTagName“返回类的新实例DOMNodeList不仅仅是一个数组。因此,随着循环的进行,它正在检索元素;删除一个会打乱它对存在的假设。

一种解决方案是在循环之前将整个匹配列表复制到一个普通数组中。有一个内置函数iterator_to_array()可以一次性为您完成所有工作 - 基本上,它foreach在可迭代对象上运行 a,并将值收集到一个数组中。

所以最简单(虽然不一定是最易读等)的解决方案是改变这一行:

foreach ($dom->getElementsByTagName('route') as $route)

对此:

foreach (iterator_to_array($dom->getElementsByTagName('route')) as $route)

这是固定代码的现场演示。

于 2013-08-24T14:09:11.923 回答