2013-04-06 130 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

相关问题