编辑XML文件(删除节点并添加新节点)

时间:2013-12-18 14:55:42

标签: php xml dom

我在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>

正如您所看到的,现在关闭的softwaredecryption代码位于错误的位置。

我该如何解决?我花了几个小时但找不到合适的解决方案。

问题是由removeChild()引起的,因为如果我不删除某些内容它可以正常工作。

1 个答案:

答案 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";

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