2013-12-18 101 views
0

我在PHP中处理XML时遇到了问题。我想要的是删除不需要的元素,并用另一个替换它。编辑XML文件(删除节点并添加新文件)

比方说,XML是这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<software> 
    <info> 
     <version>1.2</version> 
     <lasterror>1386680712</lasterror> 
    </info> 
    <decryption> 
     <funcgroup siglength="86"> 
      <func> 
       <name>Mk</name> 
       <args>$a</args> 
       <code>XXXX</code> 
      </func> 
      <func> 
       <name>Nk</name> 
       <args>$a,$b</args> 
       <code>XXXX</code> 
      </func> 
     </funcgroup> 
    </decryption> 
</software> 

PHP代码:

$domtree = new DOMDocument('1.0', 'UTF-8'); 
$domtree->loadXML(file_get_contents('test.xml')); 

$thedocument = $domtree->documentElement; 

$list = $thedocument->getElementsByTagName('funcgroup'); 
foreach ($list as $domElement) { 
    $sig_length = $domElement->getAttribute('siglength'); 
    if($sig_length == $signature_length) { 
     $domElement->parentNode->removeChild($domElement); 
     break; 
    } 
} 

$some_stuff = $domtree->getElementsByTagName('software'); 
$some_stuff = $domtree->getElementsByTagName('decryption'); 
$funcgroup = $domtree->appendChild($domtree->createElement('funcgroup')); 
$funcgroup->setAttribute('siglength', $signature_length); 

$func = $funcgroup->appendChild($domtree->createElement('func')); 
$func->appendChild($domtree->createElement('name', $outer_element[0])); 
$func->appendChild($domtree->createElement('args', $outer_element[1])); 
$code = $func->appendChild($domtree->createElement('code')); 
$code->appendChild($domtree->createTextNode($outer_element[2])); 

注:我删除了一些东西,否则会太复杂,我猜。上面的代码显示了我做了什么,但是没有其他一些在那个问题中不需要的循环和变量。每个变量(和数组)都被定义。所以不要担心这一点。

我想要的是删除整个<funcgroup siglength="86">以取代它与另一个。

该脚本工作正常,但在输出XML中有一个问题。它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?> 
<software> 
    <info> 
     <version>6.3</version> 
     <lasterror>1386680712</lasterror> 
    </info> 
    <decryption/> 
</software> 
<funcgroup siglength="86"> 
<func> 
    <name>Nk</name> 
    <args>$a</args> 
    <code>YYYYY</code> 
</func> 
<func> 
    <name>Ok</name> 
    <args>$a,$b</args> 
    <code>YYYY</code> 
</func> 
</funcgroup> 

正如你看到的,封闭softwaredecryption标签是在错误的地方了。

我该如何解决这个问题?我花了几个小时,但找不到工作解决方案。

这个问题是由removeChild()造成的,因为它工作正常,如果我不删除的东西。

回答

1

您要添加新的子节点添加到文件本身(而不是decryption节点),这是不是你想要

$domtree->appendChild 

什么相反,你应该:

$decryption = $domtree->getElementsByTagName('decryption')->item(0); 
$funcgroup = $decryption->appendChild($domtree->createElement('funcgroup')); 

编辑:

您可以通过doin编辑lasterror节点的文本值:

$domtree->getElementsByTagName('lasterror')->item(0)->firstChild->nodeValue = "New value"; 

请参阅DOMNodeListDOMNode类的文档,以了解您可以使用它做什么。

+0

谢谢,但现在我得到了'致命错误:调用未定义的方法DOMNodeList :: appendChild()'。 XML是如此令人困惑的LOL。特别是当你以前从来没有处理过它。我感谢您的帮助。 – Michael

+0

@Michael更正 - 项目(0)失踪。 – vbence

+0

哦,男士:D非常感谢!你不知道我现在有多幸福。在这上面浪费了很多时间。谢谢! <3 – Michael