2009-08-06 12 views
9

मूल रूप से मुझे चर का उपयोग करके नोड नाम और इसकी सीडीएटीए सामग्री को परिभाषित करने की आवश्यकता है।ई 4 एक्स सीडीएटीए सामग्री जोड़ें

var nodeName:String = "tag"; 
var nodeValue:String = "<non-escaped-content>"; 

भोलेपन से मुझे लगा कि यह काम करेगा:

var xml:XML = <doc><{nodeName}><![CDATA[{nodeValue}]]></{nodeName}> 

आउटपुट:

<doc><tag><![CDATA[{nodeValue}]]></tag></doc> 

FP9 के लिए बनाया गया स्क्रिप्ट के पिछले संस्करण में मैं का उपयोग करके समस्या को नजरअंदाज :

new XMLNode(XMLNodeType.XMLNodeType.CDATA_NODE, nodeValue); // ... 

लेकिन यह एफपी 10 में काम नहीं कर रहा है, और मुझे लगता है कि विधि किसी भी तरह से कमजोर है।

कोई भी इसके लिए एक सुरुचिपूर्ण समाधान है?

+0

उत्तर अद्यतन ... नमस्कार – back2dos

उत्तर

6

कैसे इस बारे में:

var xml:XML = <doc><{nodeName}>{nodeValue}</{nodeName}></doc> 
trace(xml.toXMLString()); 

आउटपुट:

<doc> 
    <tag>&lt;non-escaped-content&gt;</tag> 
</doc> 

मैं मानता, इस CDATA नहीं है, लेकिन मैं एक समस्या नहीं दिख रहा है ... पार्स थोड़ा और समय की आवश्यकता है, लेकिन OTOH, सही बहुत CDATA से अधिक मजबूत बचने ...

XMLNode साथ संस्करण flash.xml पैकेज, जिसके लिए है का उपयोग करता है AS2 के साथ संगतता के पीछे की ओर ... यहां तक ​​कि नोटिस नहीं किया, यह FP10 के तहत चला गया था ... फिर भी, आप एक प्रतिस्थापन के रूप में इस

var x:XML = new XML("<![CDATA[" + nodeValue + "]]>"); 

इस्तेमाल कर सकते हैं और उसके बाद के रूप में आप flash.xml के साथ होता appendChild का उपयोग .. ।

वैकल्पिक रूप से आप यह E4X शैली इस्तेमाल कर सकते हैं, यदि आप इसे एक समारोह में लपेट

function cdata(data:String):XML { 
    return = new XML("<![CDATA[" + data + "]]>"); 
} 

और फिर

var xml:XML = <doc><{nodeName}>{cdata(nodeValue)}</{nodeName}></doc> 

लेकिन व्यक्तिगत रूप से, मुझे लगता है कि तार, कि दोनों पाठ आधारित है और अपेक्षाकृत कम कर रहे हैं, भाग निकले किया जाना चाहिए, न कि उसके बाद CDATA में लिपटे ...


अद्यतन: मैं अपनी बात नहीं मिलता यहाँ

"&lt;" is very different than a "<"

है कि क्या पूरी बात के बारे में ...: डी ... "<", पार्स करने के दौरान दर्शाया जाएगा जबकि "&lt;" है बस r "<" पर econverted, तो एक्सएमएल पार्स करने के बाद, आपके पास ठीक पहले जैसा ही स्ट्रिंग होगा ...

इस

मेरी कोड है:

package { 
    import flash.display.MovieClip; 
    public class Main extends MovieClip {  
     public function Main():void { 
      var nodeName:String = "tag"; 
      var nodeValue:String = "<non-escaped-content>"; 
      var xml:XML = <doc><{nodeName}>{cdata(nodeValue)}</{nodeName}></doc>; 
      trace(cdata("test").toXMLString()); 
      trace(xml.toXMLString()); 
     } 
     private function cdata(data:String):XML { 
      return new XML("<![CDATA[" + data + "]]>"); 
     } 
    } 
} 

फ़्लैश प्लेयर 10, फ्लेक्स एसडीके 4 के साथ संकलित पर मेरे लिए पूरी तरह से काम करता है ... हाथ में एक फ्लैश आईडीई की जरूरत नहीं है, लेकिन जब यह शुद्ध ActionScript की बात आती है परिणाम लगभग निश्चित रूप से वही हैं, इसलिए इसे काम करना चाहिए (यदि आप चाहें तो आप इसे अपने दस्तावेज़ वर्ग के रूप में उपयोग कर सकते हैं, या बस इसे तुरंत चालू कर सकते हैं) ...

btw। पहले का पता लगाने से पता चलता है, दूसरा उदाहरण काम करता है कि, है, जो भी काफी स्पष्ट है के बाद से new XML(<String>) देशी XML दिया स्ट्रिंग से एक XML बनाने के लिए पार्सर का उपयोग करता है ...

यहाँ क्या ऊपर उत्पन्न करता है:

<![CDATA[test]]> 
<doc> 
    <tag><![CDATA[<non-escaped-content>]]></tag> 
</doc> 

काम करता है मेरे लिए काफी अच्छा ... :)


greetz

वापस 2dos

+0

अरे, धन्यवाद। कारण मैं सीडीएटीए चाहता हूं कि यह तरीका एक्सएमएल समेत तारों को लॉग करने के लिए प्रयोग किया जाता है, जहां "<" निश्चित रूप से "<" से बहुत अलग है ... दुर्भाग्यवश दूसरा समाधान सीडीएटीए के टैग को "< में परिवर्तित करेगा [सीडीएटीए []] > "सीडीएटीए() के पूरे हस्ताक्षर को अनदेखा कर रहा है :(क्या आपने वास्तव में तीसरा समाधान काम किया था? यह एफपी 9 में काम करता था लेकिन मुझे एफपी 10 में रनटाइम त्रुटि देता है? –

+0

मुझे सीडीटा नहीं मिल रहा है फ्लेक्स एसडीके 3.X कुछ भी संकलित करने के लिए सहायक कार्य। – taudep

+0

@taudep: आपको क्या त्रुटियां मिल रही हैं? – back2dos

7

उपरोक्त सीडीएटी फ़ंक्शन को निम्न की तरह दिखने की आवश्यकता है, नोटिस करें कि अंतिम ">" कोड में भाग गया है। अन्यथा संकलन त्रुटियां हैं।

private function cdata(data:String):XML 
{ 
    return new XML("<![CDATA[" + data + "]]\>");     
} 
+0

यह विधि अच्छी तरह से काम करती है सभी मामलों के लिए लेकिन अगर मेरा डेटा है ']]>' मुझे त्रुटि मिल रही है "रूट तत्व के बाद दस्तावेज़ में मार्कअप अच्छी तरह से गठित होना चाहिए।" xml में कनवर्ट करते समय। क्या इसे ठीक करने का कोई और तरीका है? –

2

धन्यवाद, cdata समारोह बहुत उपयोगी है। मैंने सिर्फ एक नया लिखा है।

var nodeName:String = "tag"; 
var nodeValue:String = "<non-escaped-content>"; 
var xml:XML = <doc><{nodeName}>{new XML("<![CDATA[" + nodeValue + "]]>")}</{nodeName}></doc>; 

आप मौजूदा नोड्स को बदलने के लिए की जरूरत है: ठीक

function newNode(nodeName:String,nodeValue:String):XML{ 
    return new XML(<{nodeName}>{cdata(nodeValue)}</{nodeName}>); 
} 
2
private function cdata(data:String, nodeName:String):XML{ 
    return new XML("<"+nodeName+"><![CDATA[" + data + "]]\></"+nodeName+">"); 
} 

काम :)

1

यहाँ एक और समाधान

public static function getCDATANode(data:String, tagName:String):void 
{ 
     var node:XML = new XML( "<" + tagName + "/>"); 
     var cdata:XML = new XML("<![CDATA[" + data + " ]]>"); 
     node.appendChild(cdata); 

     trace("getCDATANode: ", node.toXMLString()); 
} 
1

यहाँ कार्यों का उपयोग किए बिना मेरी समाधान है सामग्री और नोड अट्री रखें आप उपयोग कर सकते हैं:

var newNodeValue:String = "<non-escaped-content>"; 
var xml:XML = <doc><tag attribute="true">This is node content</tag></doc>; 

xml.tag[0].setChildren(new XMLList()); 
xml.tag[0].appendChild(new XML("<![CDATA[" + newNodeValue + "]]>")); 
संबंधित मुद्दे