且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何用SimpleXMLElement PHP替换XML节点

更新时间:2022-01-06 06:28:54

类似于 SimpleXML:附录中概述的内容一棵树到另一棵树 ,您可以将这些节点导入到DOMDocument中,因为在编写时:

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

类SimpleXMLElement没有像DOM这样的方法'replaceChild'."

因此,当您导入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://***.com"/>
    <layer label="Teste2" type="dynamic" visible="false" useproxy="true" usePopUp="all" url="http://google.com"/>
</operationallayers>
   </map>
</root>

此外,您还可以执行此操作,并将操作添加到SimpleXMLElement中,以便轻松包装它.这是通过从SimpleXMLElement扩展而来的:

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);
    }
}

用法示例:

$xml1 = simplexml_load_string($string1, 'MySimpleXMLElement');
$xml2 = simplexml_load_string($string2);

$xml1->map->operationallayers->replace($xml2);

相关: 在SimpleXML中,如何添加现有的SimpleXMLElement作为子元素? .

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

上次我在***上扩展SimpleXMLElement是在 读取并获取XML属性的值"的答案中href ="https://***.com/a/17534645/367456"> em>问题.

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