PHP SimpleXML: insert node at certain position

前端 未结 2 968
误落风尘
误落风尘 2020-11-28 14:47

say I have XML:


  
  
  
  
  
  

         


        
2条回答
  •  南方客
    南方客 (楼主)
    2020-11-28 15:30

    The following is a function to insert a new SimpleXMLElement after some other SimpleXMLElement. Since this isn't directly possible with SimpleXML, it uses some DOM classes/methods behind-the-scenes to get the job done.

    function simplexml_insert_after(SimpleXMLElement $insert, SimpleXMLElement $target)
    {
        $target_dom = dom_import_simplexml($target);
        $insert_dom = $target_dom->ownerDocument->importNode(dom_import_simplexml($insert), true);
        if ($target_dom->nextSibling) {
            return $target_dom->parentNode->insertBefore($insert_dom, $target_dom->nextSibling);
        } else {
            return $target_dom->parentNode->appendChild($insert_dom);
        }
    }
    

    And an example of how it might be used (specific to your question):

    $sxe = new SimpleXMLElement('');
    // New element to be inserted
    $insert = new SimpleXMLElement("");
    // Get the last nodeA element
    $target = current($sxe->xpath('//nodeA[last()]'));
    // Insert the new element after the last nodeA
    simplexml_insert_after($insert, $target);
    // Peek at the new XML
    echo $sxe->asXML();
    

    If you want/need an explanation of how this works (the code is fairly simple but might include foreign concepts), just ask.

提交回复
热议问题