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