2013-08-24 108 views
1

无法从XML文档无法删除XML文档中的所有儿童(PHP)

<?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与属性的元素博客

+0

你为什么要建立一个'的SimpleXML '对象和两个'DOM'对象?这是否与$ dom = new \ DOMDocument()一样? $ dom->负载( 'routes.xml')'? – IMSoP

+0

因为你是对的,关于拆除孩子的问题呢? –

回答

0

的问题在于你在循环时修改文档 - 有点像修改foreach循环中的数组。请注意0​​不只是一个数组。所以随着循环的循环,它正在检索元素。删除一个会搞砸对存在的假设。

解决此问题的一个办法是在遍历它之前将整个匹配列表复制到普通数组中。有一个内置的函数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.