2013-07-15 7 views
5

मैं निम्न XML (string1) है:कैसे SimpleXMLElement पीएचपी साथ एक्सएमएल नोड को बदलने के लिए

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

और मैं एक्सएमएल के इस टुकड़े (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 इस्तेमाल किया respectives वर के लिए दोनों आयात करने के लिए:

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

अब, मैं के लिए string1 की नोड 'operationallayers' बदलना चाहते हैं स्ट्रिंग 2 के नोड 'ऑपरेशनलेयर', लेकिन कैसे?

कक्षा SimpleXMLElement में DOM की तरह 'replaceChild' विधि नहीं है।

उत्तर

6

क्या SimpleXML: append one tree to another में उल्लिखित किया गया है आप DOMDocument में उन नोड्स आयात कर सकते हैं करने के लिए इसी तरह की है क्योंकि आप लिखने के रूप में:

"वर्ग SimpleXMLElement न डोम की तरह एक विधि 'replaceChild' है।" (गैर सजा)

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

संबंधित: In SimpleXML, how can I add an existing SimpleXMLElement as a child element?

पिछली बार जब मैंने Stackoverflow पर SimpleXMLElement बढ़ाया answer to the "Read and take value of XML attributes" question में था।

+0

@hakre क्या यह काम नेमस्पेस के साथ बनाना संभव है? – Nightwolf

+0

@ hakre मैंने $ xml2 पर अपने विशिष्ट उपयोग मामले के लिए एक नामस्थान रैपर बनाया लेकिन यह संभव होगा कि यह संभव हो तो कक्षा में बनाया गया हो। – Nightwolf

संबंधित मुद्दे