附加孩子的孩子元素

时间:2013-11-04 16:03:34

标签: php xpath simplexml

有没有办法追加SimpleXML元素孩子的孩子?

例如

<comments>
    <comment1>
        <commentcontent>Test</commentcontent>
    </comment1>
    <comment2>
        <commentcontent>Test2</commentcontent>
        <comment3>
            <commentcontent>Test3</commentcontent>
        </comment3>
    </comment2>
</comments>

我希望comment3能够拥有它的子注释。我以为我可以使用一些正则表达式或通配符来忽略注释元素的数量但是还没有弄清楚它是怎么回事。

我在尝试

$commentlevel = calculatelevel(($level[$commentkey] - 1)) . 'Comment' . $parent[$commentkey];
$newcomment = $commentsxml->xpath($commentlevel)->addChild('Comment' . $id);

function calculatelevel($level) {
    $compile = '';
    for($inc = 0; $inc < $level; $inc++) {
        $compile = 'Comment*/';
    }
    return $compile;
}

和许多变化,但似乎都失败了。感谢。

1 个答案:

答案 0 :(得分:0)

如果可以,请“规范化”您的XML:

<comments>
    <comment id="1" content="Test">
        <comment id="2" content="Hello">
            <comment id="3" content="World">
                <comment id="4" content="It's me!" />
            </comment>
        </comment>
    </comment>
</comments>

子评论很简单,因为您不必考虑更改节点名称:

$comment = $xml->xpath("//comment[@id='4']")[0]; // get comment #4 , requires PHP >= 5.4
$newcomment = $comment->addChild('comment');
$newcomment->addAttribute('id', getNewId()); // function getNewId() not specified in this example 
$newcomment->addAttribute('content', 'I am new!'); 

看到它有效:http://codepad.viper-7.com/K1cxAq

如果你有PHP&lt; 5.4,升级或更改此行:

list($comment,) = $xml->xpath("//comment[@id='4']");

如果您无法更改XML但必须坚持使用它,请澄清node-name中数字的含义:它是唯一标识符,还是节点的级别,“深度” ?