2011-01-13 31 views
15

tôi có một xml như:Làm thế nào để viết CData trong xml

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

tôi đang ghi dữ liệu trong nó như:

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

nhưng sự thay đổi của nó "<" thành "& lt" của CDATA . Vui lòng cho tôi biết cách điền các giá trị ở định dạng xml ở trên dưới định dạng CData.

tôi biết rằng chúng tôi có thể tạo CDATA như:

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

nhưng quá trình của tôi là để đọc nút của xml và thay đổi giá trị của nó không để nối thêm vào nó. Cảm ơn

Trả lời

14

Bạn thực sự cần nó để được trong CDATA, hoặc làm bạn chỉ muốn để có được những văn bản trong đó theo một cách mà sẽ không yêu cầu thêm thoát trong mã của bạn?

InnerText Thực hiện bất cứ điều gì thoát được yêu cầu, vì vậy thường tôi chỉ cần sử dụng

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

... nhưng nếu bạn thực sự muốn có một CDATA node, bạn có thể tạo một bản thân như mỗi câu trả lời Nekresh của.

+0

Điều đó có nghĩa là cách tôi đang thực hiện viết bằng xml. các nhân vật excape sẽ tự động xử lý và người đọc xml sẽ không phải đối mặt với bất kỳ vấn đề và xml của tôi sẽ không break..right? –

+0

@Rajesh: Chính xác. Bạn có thể nói rằng thiết lập thuộc tính 'InnerText' thực hiện thoát vì đó là lý do tại sao phương thức hiện tại của bạn không hoạt động - nó thoát khỏi văn bản"

16

Như đã trình bày ở đây: 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

Tôi không muốn nối thêm. tôi muốn thay đổi giá trị của nó .. các yếu tố đã có –

0

Bạn có thể sử dụng writer.WriteCData(value);

nơi người viết là đối tượng XmlWriter.

1

Sử dụng Node.InnerXml, không phải Node.InnerText. Node.InnerText tự động thay thế các giá trị đặc biệt. Lưu ý rằng nếu bạn chỉ định với CDATA trong InnerXml, thì Node.InnerText là văn bản trong CDATA. Ví dụ:

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; 
    } 
} 

đầu ra Chương trình:

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

Nếu bạn thực sự cần một phần CDATA (xem Jon's answer), bạn có thể đạt được điều đó như sau:

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

này sẽ thay thế nội dung của xnode, không thêm vào nội dung đó.

2
XmlNode childNode = node.ChildNodes[0]; 
if (childNode is XmlCDataSection) 
{ 
    XmlCDataSection cdataSection = childNode as XmlCDataSection; 
    cdataSection.Value = newValue; 
} 
Các vấn đề liên quan