2013-07-15 17 views
5

Mam następujące XML (łańcuch1):Jak wymienić węzeł XML z SimpleXMLElement PHP

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

I mam ten fragment XML (łańcuch2):

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

użyłem función simplexml_load_string do zaimportowania obydwu do respives var:

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

Teraz chcę zastąpić węzeł "operatory" ciągu 1 dla węzeł "operatorzy" ciągu 2, ale jak?

Klasa SimpleXMLElement nie ma metody "replaceChild", takiej jak DOM.

Odpowiedz

6

podobne do tego, co zostało przedstawione w SimpleXML: append one tree to another można importować te węzły w DOMDocument bo jak piszesz:

„Klasa SimpleXMLElement nie masz metodę«replaceChild»jak DOM.”

więc podczas importowania do DOM można użyć tych:

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

co daje następujący wynik (non-upiększony):

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

Dodatkowo można potem wziąć to i dodaj operację do SimpleXMLElement, aby była łatwo opakowana. Polega ona na rozciągający się od 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); 
    } 
} 

przykład użycia:

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

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

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

Ostatni raz Rozszerzony SimpleXMLElement na Stackoverflow był w answer to the "Read and take value of XML attributes" question.

+0

@hakre Czy możliwe jest wykonanie tej pracy z przestrzeniami nazw? – Nightwolf

+0

@hakre Stworzyłem opakowanie przestrzeni nazw dla mojego konkretnego przypadku użycia na $ xml2, ale byłoby miło, gdyby to było wbudowane w klasę, jeśli to możliwe. – Nightwolf

Powiązane problemy