代码之家  ›  专栏  ›  技术社区  ›  Cybrix

使用带有索引位置的addChild

  •  2
  • Cybrix  · 技术社区  · 14 年前

    当我添加一个子节点时,如何根据它的同级来选择它的位置?

    <?php
        $_XML = '   <Test>
                        <Menu>
                            <Link href="page1.htm" />
                            <Link href="page2.htm" />
                            <Link href="page4.htm" />
                        </Menu>
                    </Test>';
    
        $_RenderedXML = new SimpleXMLElement($_XML);
    
        //Add a new Link node
        $_NewLink = $_RenderedXML->Menu->addChild("Link");
        $_NewLink->addAttribute("href", "page3.htm");
    
        echo $_RenderedXML->asXML();
    ?>
    

    这将呈现XML及其同级下面的新节点。 我想说明一下它的位置。

    addChild("Link", 2) //or something.
    
    2 回复  |  直到 11 年前
        1
  •  2
  •   Community CDub    8 年前

    我知道 Artefacto's answer 已被接受,但它似乎正在做更多的工作比需要的。一个更简单的选择,使用他的函数签名,可以像下面的函数。

    function addchild_at(SimpleXMLElement $sxml, $tagname, $i)
    {
        $parent = dom_import_simplexml($sxml);
        $child  = $parent->ownerDocument->createElement($tagname);
        $target = $parent->getElementsByTagname('*')->item($i);
        if ($target === NULL) {
            $parent->appendChild($child);
        } else {
            $parent->insertBefore($child, $target);
        }
    }
    
        2
  •  1
  •   Artefacto    14 年前

    dom_import_simplexml .

    $_RenderedXML = new SimpleXMLElement($_XML);
    
    //Add a new Link node
    addchild_at($_RenderedXML->Menu, "Link", 2);
    $_RenderedXML->Menu->Link[2]->addAttribute("href", "page3.htm");
    
    
    function addchild_at(SimpleXMLElement $sxml, $tagname, $i) {
        $elem = dom_import_simplexml($sxml);
        $new = $elem->ownerDocument->createElement($tagname);
        $chnodes = array();
        foreach ($elem->childNodes as $cn) {
            $chnodes[] = $cn;
        }
        $chnodes = array_filter($chnodes,
            function (DOMNode $dn) { return $dn->nodeType == XML_ELEMENT_NODE; }
        );
        $chnodes = array_values($chnodes);
    
        if ($i < count($chnodes))
            $elem->insertBefore($new, $chnodes[$i]);
        else
            $elem->appendChild($new);
    }