2013-08-24 144 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.