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

时间:2013-08-24 13:15:47

标签: php xml simplexml

无法从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();

仅使用博客

属性删除2个元素

1 个答案:

答案 0 :(得分:0)

问题是你在循环时修改文档 - 有点像在foreach循环中修改数组。

请注意$dom->getElementsByTagName "returns a new instance of class DOMNodeList"不仅仅是一个数组。因此,当循环转过来时,它会检索元素。删除一个将搞乱其存在的假设。

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

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

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

到此:

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

Here's a live demo of the fixed code.