我有以下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>
Run Code Online (Sandbox Code Playgroud)
我有这段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>
Run Code Online (Sandbox Code Playgroud)
我使用函数simplexml_load_string将两者都导入到各自的var:
$xml1 = simplexml_load_string($string1);
$xml2 = simplexml_load_string($string2);
Run Code Online (Sandbox Code Playgroud)
现在,我想为string2的节点'operationslayers'替换string1的节点'operationallayers',但是如何?
SimpleXMLElement类没有像DOM那样的方法'replaceChild'.
与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();
Run Code Online (Sandbox Code Playgroud)
这给你以下输出(非美化):
<?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>
Run Code Online (Sandbox Code Playgroud)
此外,您可以将此操作添加到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);
}
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
$xml1 = simplexml_load_string($string1, 'MySimpleXMLElement');
$xml2 = simplexml_load_string($string2);
$xml1->map->operationallayers->replace($xml2);
Run Code Online (Sandbox Code Playgroud)
相关:在SimpleXML中,如何将现有的SimpleXMLElement添加为子元素?.
上次我在Stackoverflow上扩展SimpleXMLElement是对"读取和获取XML属性值"问题的回答.
归档时间: |
|
查看次数: |
7999 次 |
最近记录: |