2010-08-06 34 views
8

से सहेजने से कैसे रोकें मैं अपने XML दस्तावेज़ों में से किसी एक के भीतर एक बच्चे नोड में जोड़ने के लिए simpleXML का उपयोग कर रहा हूं ... जब मैं अपने simpleXML ऑब्जेक्ट पर print_r करता हूं, तो < अभी भी एक के रूप में प्रदर्शित किया जा रहा है दृश्य स्रोत में <। हालांकि, मैं इस वस्तु वापस DOMDocument का उपयोग कर एक्सएमएल को सहेजने के बाद, <&lt; में बदल जाती है और >&gt;DOMDocument को <as & lt

कैसे इस व्यवहार को बदलने के लिए पर कोई भी विचार में बदल जाती है? मैंने dom->substituteEntities = false; जोड़ने का प्रयास किया है, लेकिन यह अच्छा नहीं था।

//Convert SimpleXML element to DOM and save 
    $dom = new DOMDocument('1.0'); 
    $dom->preserveWhiteSpace = false; 
    $dom->formatOutput = false; 
    $dom->substituteEntities = false; 
    $dom->loadXML($xml->asXML()); 
    $dom->save($filename); 

यहाँ है जहाँ मैं उपयोग कर रहा हूँ <:

$new_hint = '<![CDATA[' . $value[0] . ']]>';    
$PrintQuestion->content->multichoice->feedback->hint->Passage->Paragraph->addChild('TextFragment', $new_hint); 

समस्या नहीं, मैं सरल XML का उपयोग कर रहा XML दस्तावेज में कुछ नोड्स के माध्यम से पुनरावृति करने के लिए, और अगर एक विशेषता एक मेल खाता है दी गई आईडी, सीडीएटीए के साथ एक विशिष्ट बाल नोड जोड़ा जाता है। फिर सभी प्रक्रियाओं के बाद, मैं XML को वापस DOMDocument का उपयोग करके फ़ाइल में सहेजता हूं, जहां < को & लेफ्टिनेंट आदि में परिवर्तित किया जाता है।

यहां मेरी पूरी कक्षा फ़ाइल का एक लिंक है, ताकि आप एक बेहतर विचार प्राप्त कर सकें मैं क्या हासिल करने की कोशिश कर रहा हूँ। विशेष रूप से नीचे hint_insert() विधि का संदर्भ लें।

http://pastie.org/1079562

+0

'<' बस एक XML तत्व के भीतर एक कानूनी चरित्र (जब तक आप एक CDATA अनुभाग में हैं) नहीं है। आप क्या खत्म करने की कोशिश कर रहे हैं? – MvanGeest

+0

मैं एक सीडीएटीए टैग जोड़ने को पूरा करने की कोशिश कर रहा हूं ... अपडेट कोड के लिए मूल पोस्ट की जांच करें – ThinkingInBits

+0

वोट के लिए धन्यवाद! जब आप नोड के भीतर '<' and '>' रखते हैं तो सीडीएटीए टैग आवश्यक है (जब तक आप बचें) xml में! एक्सएचटीएमएल के समान ... – xandercoded

उत्तर

10

SimpleXML और php5 का DOM module दस्तावेज़ का एक ही आंतरिक प्रतिनिधित्व (libxml द्वारा सुविधा) का उपयोग करें। आप simplexml_import_dom() और dom_import_simplexml() के माध्यम से दस्तावेज़ को फिर से पार्स किए बिना दोनों एपिस के बीच स्विच कर सकते हैं।
आईई।यदि आप वास्तव में अपने तत्व को प्राप्त करने के बाद SimpleXML एपीआई के साथ पुनरावृत्ति करना चाहते हैं तो आप उसी दस्तावेज़ में DOM एपीआई और create the CData section पर स्विच कर सकते हैं।

<?php 
$doc = new SimpleXMLElement('<a> 
    <b id="id1">a</b> 
    <b id="id2">b</b> 
    <b id="id3">c</b> 
</a>'); 


foreach($doc->xpath('b[@id="id2"]') as $b) { 
    $b = dom_import_simplexml($b); 
    $cdata = $b->ownerDocument->createCDataSection('0<>1'); 
    $b->appendChild($cdata); 
    unset($b); 
} 

echo $doc->asxml(); 

प्रिंट

<?xml version="1.0"?> 
<a> 
    <b id="id1">a</b> 
    <b id="id2">b<![CDATA[0<>1]]></b> 
    <b id="id3">c</b> 
</a> 
+0

आपको धन्यवाद। यह वह जानकारी है जो मुझे चाहिए। मुझे एहसास नहीं हुआ कि मैं दोनों एक दूसरे के लिए उपयोग कर सकता हूं। – ThinkingInBits

+0

$ b = dom_import_simplexml ($ b) सेटिंग को पुन: स्थापित करेगा? – ThinkingInBits

+0

यह काम करता है, लेकिन मुझे 100% समझ में नहीं आता क्यों: पी – ThinkingInBits

3

समस्या यह है कि आप की संभावना जोड़ रहे है कि एक स्ट्रिंग के रूप के बजाय एक तत्व के रूप।

तो, बजाय:

$simple->addChild('foo', '<something/>'); 

जो पाठ के रूप में माना जाएगा:

$child = $simple->addChild('foo'); 
$child->addChild('something'); 

आप एक शाब्दिक < XML दस्तावेज़ के शरीर में जब तक यह के उद्घाटन के अवसर है नहीं हो सकता टैग।

संपादित करें: कि आप टिप्पणियों में वर्णन करने के बाद, मुझे लगता है कि आप के बाद कर रहे हैं:

DomDocument::createCDatatSection()

$child = $dom->createCDataSection('your <cdata> body '); 
$dom->appendChild($child); 

EDIT2: अपने संपादित पढ़ने के बाद, वहाँ केवल एक बात मैं कर सकते हैं कहें:

You're doing it wrong... आप तत्वों को किसी अन्य तत्व के लिए स्ट्रिंग मान के रूप में नहीं जोड़ सकते हैं। क्षमा करें, आप बस नहीं कर सकते। यही कारण है कि यह चीजों से बच रहा है, क्योंकि डीओएम और सिंपलएक्सएमएल यह सुनिश्चित करने के लिए हैं कि आप हमेशा वैध एक्सएमएल बनाते हैं। आप एक वस्तु के रूप तत्व बनाने की आवश्यकता ... तो, आप CDATA बच्चे बनाना चाहते हैं, तो आप इस तरह कुछ करने के लिए चाहते हैं:

$child = $PrintQuestion.....->addChild('TextFragment'); 
$domNode = dom_import_simplexml($child); 
$cdata = $domNode->ownerDocument->createCDataSection($value[0]); 
$domNode->appendChild($cdata); 

इसके लिए बस इतना होना चाहिए कि ...

+0

यह एक सीडीएटीए टैग का उद्घाटन और समापन है जो मुझे मुद्दा दे रहा है ... कृपया मूल पोस्ट देखें। – ThinkingInBits

+0

@TinkingInBits: – ircmaxell

+0

संपादित करें यह सही जवाब भी था, बस उस समय इसे समझ में नहीं आया। धन्यवाद, हालांकि धन्यवाद। – ThinkingInBits

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