6

我有以下 XML (string1):

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

我有这段 XML (string2):

<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>

我使用函数 simplexml_load_string 将两者都导入到各自的 var 中:

$xml1 = simplexml_load_string($string1);
$xml2 = simplexml_load_string($string2);

现在,我想将 string1 的节点 'operationallayers' 替换为 string2 的节点 'operationallayers',但是如何?

SimpleXMLElement 类没有像 DOM 那样的“replaceChild”方法。

4

1 回答 1

11

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

“SimpleXMLElement 类没有像 DOM 那样的方法‘replaceChild’。”

因此,当您导入 DOM 时,您可以使用这些:

$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();

它为您提供以下输出(未美化):

<?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>

此外,您可以使用它并将操作添加到您的 SimpleXMLElement 中,以便轻松包装它。这通过从 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 添加为子元素?.

上次我在 Stackoverflow 上扩展 SimpleXMLElement 是在回答“读取并获取 XML 属性的值”问题

于 2013-07-16T08:20:13.117 回答