How to replace XML node with SimpleXMLElement PHP

后端 未结 1 1932
面向向阳花
面向向阳花 2021-01-05 13:19

I have the following XML (string1):



   
      
         

        
相关标签:
1条回答
  • 2021-01-05 14:06

    Similar to what has been outlined in SimpleXML: append one tree to another you can import those nodes into DOMDocument because as you write:

    "The class SimpleXMLElement dont have a method 'replaceChild' like the DOM."

    So when you import into DOM you can use those:

    $xml1 = simplexml_load_string($string1);
    $xml2 = simplexml_load_string($string2);
    
    $domToChange = dom_import_simplexml($xml1->map->operationallayers);
    $domReplace  = dom_import_simplexml($xml2);
    $nodeImport  = $domToChange->ownerDocument->importNode($domReplace, TRUE);
    $domToChange->parentNode->replaceChild($nodeImport, $domToChange);
    
    echo $xml1->asXML();
    

    Which gives you the following output (non-beautified):

    <?xml version="1.0"?>
    <root>
       <map>
          <operationallayers>
        <layer label="Teste1" type="feature" visible="false" useproxy="true" usePopUp="all" url="http://stackoverflow.com"/>
        <layer label="Teste2" type="dynamic" visible="false" useproxy="true" usePopUp="all" url="http://google.com"/>
    </operationallayers>
       </map>
    </root>
    

    Additionally you can then take this and add the operation to your SimpleXMLElement so that it's easily wrapped. This works by extending from SimpleXMLElement:

    /**
     * Class MySimpleXMLElement
     */
    class MySimpleXMLElement extends SimpleXMLElement
    {
        /**
         * @param SimpleXMLElement $element
         */
        public function replace(SimpleXMLElement $element) {
            $dom     = dom_import_simplexml($this);
            $import  = $dom->ownerDocument->importNode(
                dom_import_simplexml($element),
                TRUE
            );
            $dom->parentNode->replaceChild($import, $dom);
        }
    }
    

    Usage Example:

    $xml1 = simplexml_load_string($string1, 'MySimpleXMLElement');
    $xml2 = simplexml_load_string($string2);
    
    $xml1->map->operationallayers->replace($xml2);
    

    Related: In SimpleXML, how can I add an existing SimpleXMLElement as a child element?.

    Last time I extended SimpleXMLElement on Stackoverflow was in an answer to the "Read and take value of XML attributes" question.

    0 讨论(0)
提交回复
热议问题