我在PHP中处理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>
正如您所看到的,现在关闭的software
和decryption
代码位于错误的位置。
我该如何解决?我花了几个小时但找不到合适的解决方案。
问题是由removeChild()
引起的,因为如果我不删除某些内容它可以正常工作。
答案 0 :(得分: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";
请参阅DOMNodeList和DOMNode课程的文档,了解您还可以使用它做什么。