2010-07-29 7 views
7

कहते हैं कि मैं एक्सएमएल है:पीएचपी SimpleXML: निश्चित स्थिति में नोड डालने

<root> 
    <nodeA /> 
    <nodeA /> 
    <nodeA /> 
    <nodeC /> 
    <nodeC /> 
    <nodeC /> 
</root> 

मैं कैसे के रूप में और सी के बीच "nodeB" डालूँ? PHP में, अधिमानतः SimpleXML के माध्यम से? पसंद:

<root> 
    <nodeA /> 
    <nodeA /> 
    <nodeA /> 
    <nodeB /> 
    <nodeC /> 
    <nodeC /> 
    <nodeC /> 
</root> 
+1

मुझे यकीन नहीं है कि आप कर सकते हैं। प्रलेखन से, ऐसा लगता है कि SimpleXML ** वास्तव में ** सरल हेरफेर के लिए है। – MvanGeest

+0

क्या मैं किसी और तरह से सीएस स्टोर नहीं कर सकता, उन्हें हटा सकता हूं, बी जोड़ सकता हूं, और उस अस्थायी स्थान से सीएस वापस जोड़ सकता हूं? मैं PHP में बहुत अच्छी तरह से नहीं जानता .... –

उत्तर

13

कुछ अन्य SimpleXMLElement के बाद एक नया SimpleXMLElement डालने का कार्य निम्न है। चूंकि यह सिंपलएक्सएमएल के साथ सीधे संभव नहीं है, इसलिए यह काम पाने के लिए कुछ DOM कक्षाओं/विधियों के पीछे के तरीकों का उपयोग करता है।

function simplexml_insert_after(SimpleXMLElement $insert, SimpleXMLElement $target) 
{ 
    $target_dom = dom_import_simplexml($target); 
    $insert_dom = $target_dom->ownerDocument->importNode(dom_import_simplexml($insert), true); 
    if ($target_dom->nextSibling) { 
     return $target_dom->parentNode->insertBefore($insert_dom, $target_dom->nextSibling); 
    } else { 
     return $target_dom->parentNode->appendChild($insert_dom); 
    } 
} 

और यह कैसे किया जा सकता है (अपने प्रश्न के लिए विशिष्ट) का एक उदाहरण:

$sxe = new SimpleXMLElement('<root><nodeA/><nodeA/><nodeA/><nodeC/><nodeC/><nodeC/></root>'); 
// New element to be inserted 
$insert = new SimpleXMLElement("<nodeB/>"); 
// Get the last nodeA element 
$target = current($sxe->xpath('//nodeA[last()]')); 
// Insert the new element after the last nodeA 
simplexml_insert_after($insert, $target); 
// Peek at the new XML 
echo $sxe->asXML(); 

यदि आप चाहते हैं/कि यह कैसे काम करता है का एक विवरण की जरूरत है (कोड काफी सरल है, लेकिन विदेशी अवधारणाओं को शामिल कर सकते हैं), बस पूछें।

+0

क्या यह मुझे है, या simplexml_insert_after में $ sxe पैरामीटर कभी नहीं उपयोग किया जाता है? – GolezTrol

+1

यह आप नहीं हैं, सवाल का जवाब देते समय मजा क्यों नहीं है? :) – salathe

+0

हाँ, क्यों नहीं। :) आपके उत्तर के लिए धन्यवाद, b.t.w. मैंने अपना खुद का निर्माण करने के लिए इसका उपयोग करने के लिए मुक्ति ली। :) – GolezTrol

4

सलाथ के जवाब ने मेरी मदद की, लेकिन जब से मैंने SimpleXMLElement की addChild विधि का उपयोग किया, तो मैंने बच्चों को पहले बच्चे के रूप में अधिक पारदर्शी बनाने के लिए एक समाधान मांगा। समाधान है कि डोम आधारित कार्यक्षमता लेने के लिए और SimpleXMLElement का एक उपवर्ग में इसे छिपाने के लिए है:

$xml = simplexml_load_file($inputFile, 'SimpleXMLElementEx'); 

अब आप insertChildFirst कॉल कर सकते हैं:

class SimpleXMLElementEx extends SimpleXMLElement 
{ 
    public function insertChildFirst($name, $value, $namespace) 
    { 
     // Convert ourselves to DOM. 
     $targetDom = dom_import_simplexml($this); 
     // Check for children 
     $hasChildren = $targetDom->hasChildNodes(); 

     // Create the new childnode. 
     $newNode = $this->addChild($name, $value, $namespace); 

     // Put in the first position. 
     if ($hasChildren) 
     { 
      $newNodeDom = $targetDom->ownerDocument->importNode(dom_import_simplexml($newNode), true); 
      $targetDom->insertBefore($newNodeDom, $targetDom->firstChild); 
     } 

     // Return the new node. 
     return $newNode; 
    } 
} 

सब के बाद, SimpleXML जो तत्व वर्ग का उपयोग करने के निर्दिष्ट कर सकते हैं पहले बच्चे के रूप में नए बच्चे को सम्मिलित करने के लिए किसी भी तत्व पर। विधि नए तत्व को SimpleXML तत्व के रूप में लौटाती है, इसलिए इसका उपयोग addChild के समान है। निस्संदेह एक insertChild विधि बनाने के लिए आसानी से संभव होगा जो आइटम को पहले सम्मिलित करने के लिए एक सटीक तत्व निर्दिष्ट करने की अनुमति देता है, लेकिन चूंकि मुझे अभी इसकी आवश्यकता नहीं है, इसलिए मैंने फैसला नहीं किया।