SimpleXML如何在节点中添加子节点?

时间:2010-01-19 08:13:24

标签: php simplexml

当我打电话

addChild('actor', 'John Doe');

这个孩子在最后添加。有没有办法让这个新生儿成为第一个孩子?

3 个答案:

答案 0 :(得分:21)

正如它所提到的,SimpleXML不支持,所以你必须使用DOM。以下是我的建议:将SimpleXMLElement扩展为您需要在程序中使用的任何内容。这样,您可以将所有DOM操作和其他XML魔法保留在实际程序之外。通过将两个事项分开,可以提高可读性和可维护性。

以下是如何使用新方法prependChild()扩展SimpleXMLElement:

class my_node extends SimpleXMLElement
{
    public function prependChild($name, $value)
    {
        $dom = dom_import_simplexml($this);

        $new = $dom->insertBefore(
            $dom->ownerDocument->createElement($name, $value),
            $dom->firstChild
        );

        return simplexml_import_dom($new, get_class($this));
    }
}

$actors = simplexml_load_string(
    '<actors>
        <actor>Al Pacino</actor>
        <actor>Zsa Zsa Gabor</actor>
    </actors>',
    'my_node'
);

$actors->addChild('actor', 'John Doe - last');
$actors->prependChild('actor', 'John Doe - first');

die($actors->asXML());

答案 1 :(得分:5)

看起来SimpleXML不支持这样做,所以你有两个选择:

  1. 使用DOM模块(或者可能是其他XML模块之一),并使用DOMNode::insertBefore method

  2. 创建一个新的SimpleXMLElement,复制属性,然后添加新节点,然后添加原始节点的所有子节点,然后用新节点替换原始节点。

  3. <强>更新 稍微查看一下文档之后,我会建议类似下面的内容(假设您仍然希望在大多数情况下坚持使用SimpleXML,否则,只需直接使用DOM):

    $dom_elem = dom_import_simplexml($simple_xml_element);
    $dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild);
    

答案 2 :(得分:2)

假设您可以使用insert_before函数,则可以使用以下函数:

function prependChild(parent,node){     parent.insertBefore(node,parent.firstChild); }

来源参考:XML Matters: Beyond the DOM