Как заменить узел XML на SimpleXMLElement PHP

У меня есть следующий 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> 

Я использовал funcion simplexml_load_string для импорта как для уважаемых var:

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

Теперь я хочу заменить узлы «invallallers» для строки1 для узла «операторы» строки2, но как?

Класс SimpleXMLElement не имеет метода «replaceChild», как у DOM.

Подобно тому, что было описано в SimpleXML: добавьте одно дерево в другое, вы можете импортировать эти узлы в DOMDocument потому что, как вы пишете:

«Класс SimpleXMLElement не имеет метода« replaceChild », как DOM».

Поэтому при импорте в 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 в качестве дочернего элемента? ,

В прошлый раз, когда я расширил SimpleXMLElement в Stackoverflow, я был в ответе на вопрос «Читайте и принимайте значение атрибутов XML» .