【问题标题】:SimpleXML how to prepend a child in a node?SimpleXML 如何在节点中添加子节点?
【发布时间】:2010-01-19 08:13:24
【问题描述】:

当我打电话时

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

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

【问题讨论】:

    标签: php simplexml


    【解决方案1】:

    正如前面提到的,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());
    

    【讨论】:

    • 调用未定义的方法 SimpleXMLElement::prependChild()
    【解决方案2】:

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

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

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

    更新: 在浏览了更多文档之后,我建议如下(假设您仍然想在大多数情况下坚持使用 SimpleXML,否则,只需直接使用 DOM 来处理所有内容):

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

    【讨论】:

    • 我已经在使用第二种方法。但它看起来很丑,所以想寻求更好的选择。
    【解决方案3】:

    假设你可以使用函数 insert_before 你可以使用以下函数:

    函数 prependChild(父节点) { parent.insertBefore(节点,parent.firstChild); }

    来源参考:XML Matters: Beyond the DOM

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2020-08-25
      相关资源
      最近更新 更多