2013-04-06 41 views
1

我需要閱讀XML文件並刪除名爲<images>的所有元素以及所有關聯的子元素。我發現了類似的舊問題,但沒有奏效。我究竟做錯了什麼?有更好的方法嗎?如何刪除XML元素和所有的孩子?

XML:

<?xml version='1.0' encoding='UTF-8'?> 
<settings> 
    <background_color>#000000</background_color> 
    <show_context_menu>yes</show_context_menu> 
    <image> 
    <thumb_path>210x245.png</thumb_path> 
    <big_image_path>620x930.png</big_image_path> 
    </image> 
    <image> 
    <thumb_path>200x295.png</thumb_path> 
    <big_image_path>643x950.png</big_image_path> 
    </image> 
</settings> 

PHP:

$dom = new DOMDocument(); 
$dom->load('test.xml'); 
$thedocument = $dom->documentElement; 
$elements = $thedocument->getElementsByTagName('image'); 

foreach ($elements as $node) { 
    $node->parentNode->removeChild($node); 
} 

$save = $dom->saveXML(); 
file_put_contents('test.xml', $save) 

回答

2

我想通了一個良好的夜間睡眠後。實際上這很簡單。

$xml = simplexml_load_file('test.xml'); 
unset($xml->image); 
$xml_file = $xml->asXML(); 
$xmlFile = 'test.xml'; 
$xmlHandle = fopen($xmlFile, 'w'); 
fwrite($xmlHandle, $xml_file); 
fclose($xmlHandle); 

編輯:你可能希望把它直接保存:

$file = 'test.xml'; 

$xml = simplexml_load_file($file); 
unset($xml->image); 
$success = $xml->asXML($file); 

SimpleXMLElement::asXML()Docs

+0

+1:使用SimpleXML處理特定情況的好方法。我以爲你在尋找DOMDocument。 – hakre 2013-04-07 09:37:00

+0

@hakre我正在使用兩種解決方案,SimpleXML的確很簡單:) – dnelson 2013-04-08 17:06:07

1

在PHP手冊頁面(在這裏你要經常去1日:-)一個真棒貢獻者指出:

You can't remove DOMNodes from a DOMNodeList as you're iterating over them in a foreach loop.

然後繼續提供一個潛在的解決方案。嘗試這樣的事情,而不是:

<?php 
    $domNodeList = $domDocument->getElementsByTagname('p'); 
    $domElemsToRemove = array(); 
    foreach ($domNodeList as $domElement) { 
     // ...do stuff with $domElement... 
     $domElemsToRemove[] = $domElement; 
    } 
    foreach($domElemsToRemove as $domElement){ 
     $domElement->parentNode->removeChild($domElement); 
    } 
    ?> 
1

首先,你的XML被打破,看到<thumb>...</thumb_path>和下一行,以及 - >修復它!

然後,在3行代碼真正簡單:

$xml = simplexml_load_string($x); // $x holds your xml 
$count = $xml->image->count()-1; 
for ($i = $count;$i >= 0;$i--) unset($xml->image[$i]); 

見現場演示@http://codepad.viper-7.com/HkGy5o

+0

糟糕。謝謝。昨天晚上我正在冒煙。我最終使用'unset'發現了它。我不必迭代。我只調用了'unset($ xml-> image)',它將所有圖像元素和子元素都取出來了。 – dnelson 2013-04-06 23:35:47

+1

@dnelson:這**很酷!請回答你自己的問題,分享你的發現! – michi 2013-04-06 23:39:18

相關問題