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

und*_*ack 10 php simplexml

我打电话的时候

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

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

Jos*_*vis 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());
Run Code Online (Sandbox Code Playgroud)


pib*_*pib 5

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

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

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

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

$dom_elem = dom_import_simplexml($simple_xml_element);
$dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild);
Run Code Online (Sandbox Code Playgroud)