2011-01-13 9 views
15

में CDATA लिखने के लिए कैसे मैं एक xml की तरह:एक्सएमएल

<?xml version="1.0" encoding="UTF-8"?> 
<entry> 
    <entry_id></entry_id> 
    <entry_status></entry_status> 
    </entry> 

मैं इसे में डेटा लिख ​​रहा हूँ की तरह:

XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status"); 
xnode.InnerText = "<![CDATA[ " + Convert.ToString(sqlReader["story_status"]) + " ]]>" ;  

लेकिन इसकी परिवर्तन "<" CDATA की "& lt" करने के लिए । कृपया मुझे बताओ कि कैसे एक CDATA प्रारूप के रूप में ऊपर एक्सएमएल में मूल्यों को भरने के लिए।

मुझे पता है कि हम CDATA बना सकते हैं जैसे:

XmlNode itemDescription = doc.CreateElement("description"); 
XmlCDataSection cdata = doc.CreateCDataSection("<P>hello world</P>"); 
itemDescription.AppendChild(cdata); 
item.AppendChild(itemDescription); 

लेकिन मेरे प्रक्रिया xml का नोड पढ़ सकते हैं और उस में संलग्न करने के लिए नहीं अपने मूल्य को बदलने के लिए है। धन्यवाद

उत्तर

14

आप क्या वास्तव में इसकी जरूरत CDATA में हो सकता है, या आप बस एक तरह से जो अतिरिक्त की जरूरत नहीं होगी में वहाँ में पाठ प्राप्त करना चाहते हो अपने कोड में भाग रहा है?

InnerText प्रदर्शन जो कुछ एस्केपिंग की आवश्यकता है, तो आम तौर पर मैं सिर्फ

xnode.InnerText = Convert.ToString(sqlReader["story_status"]); 

का उपयोग करेंगे ... लेकिन अगर आप वास्तव में एक CDATA node चाहते हैं, आप एक अपने आप को Nekresh के जवाब के अनुसार बना सकते हैं।

+0

ग्रेट कि जिस तरह से मैं एक्सएमएल में लेखन प्रदर्शन कर रहा हूँ मतलब है। एक्साइप कैरेक्टर स्वचालित रूप से संभाला जाएगा और एक्सएमएल रीडर को किसी भी मुद्दे का सामना नहीं करना पड़ेगा और मेरा एक्सएमएल ब्रेक नहीं होगा..ठीक है? –

+0

@ राजेश: बिल्कुल। आप बता सकते हैं कि 'InnerText' संपत्ति की स्थापना से बचने कि वास्तव में है, क्योंकि क्यों अपने वर्तमान दृष्टिकोण काम नहीं करता है करता है - यह पाठ से बचने के है" <[CDATA [! "आप के लिए! –

16

यहाँ वर्णित के रूप में: msdn

// Create an XmlCDataSection from your document 
var cdata = xdoc.CreateCDataSection(Convert.ToString(sqlReader["story_status"])); 

// Append the cdata section to your node 
xnode.AppendChild(cdata); 
+0

मैं न संलग्न करने के लिए चाहता है। मैं अपने मूल्य को बदलना चाहता है .. तत्वों पहले से ही वहाँ –

0

आप writer.WriteCData(value);

जहां लेखक XmlWriter वस्तु है उपयोग कर सकते हैं।

1

Node.InnerXml का प्रयोग करें, नहीं Node.InnerText। नोड। इनरटेक्स्ट स्वचालित रूप से विशेष मानों को प्रतिस्थापित कर रहा है। ध्यान दें कि यदि आप इनरएक्सएमएल में सीडीएटीए के साथ निर्दिष्ट करते हैं, तो नोड। इनरटेक्स्ट सीडीएटीए में टेक्स्ट है। उदाहरण:

public class Test 
{ 
    public static int Main(string[] args) 
    { 
     const string xmlTxt = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
<entry> 
    <entry_id></entry_id> 
    <entry_status></entry_status> 
    </entry>"; 
     TextReader treader = new StringReader(xmlTxt); 
     XmlReader xreader = XmlReader.Create(treader); 
     XmlDocument xdoc = new XmlDocument(); 
     xdoc.Load(xreader); 

     XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status"); 
     //xnode.InnerText = "<![CDATA[something]]>"; 
     xnode.InnerXml = "<![CDATA[something]]>"; 
     Console.WriteLine("inner text is: " + xnode.InnerText); 

     xdoc.Save(Console.Out); Console.WriteLine(); 

     return 0; 
    } 
} 

कार्यक्रम का उत्पादन:

 
inner text is: something 
<?xml version="1.0" encoding="ibm852"?> 
<entry> 
    <entry_id> 
    </entry_id> 
    <entry_status><![CDATA[something]]></entry_status> 
</entry> 
10

तुम सच में एक CDATA अनुभाग की जरूरत है (Jon's answer देखें), आप प्राप्त कर सकते कि इतने की तरह: यह का स्थान ले लेगा

XmlNode xnode = xdoc.SelectSingleNode("entry/entry_status"); 
XmlCDataSection cdata = xdoc.CreateCDataSection(Convert.ToString(sqlReader["story_status"])); 
xnode.InnerXml = cdata.OuterXml; 

xnode की सामग्री, यह करने के लिए संलग्न नहीं।

2
XmlNode childNode = node.ChildNodes[0]; 
if (childNode is XmlCDataSection) 
{ 
    XmlCDataSection cdataSection = childNode as XmlCDataSection; 
    cdataSection.Value = newValue; 
}