How to write CData in xml

℡╲_俬逩灬. 提交于 2019-11-26 23:12:54

问题


i have an xml like :

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

i am writing data in it like:

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

but its change "<" to "&lt" of CDATA. Please tell me how to fill values in above xml as a CData format.

i know that we can create CDATA like :

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

but my process is to read node of xml and change its value not to append in it. Thanks


回答1:


Do you really need it to be in CDATA, or do you just want to get the text in there in a way which won't require extra escaping in your code?

InnerText performs whatever escaping is required, so generally I'd just use

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

... but if you really want a CDATA node, you can create one yourself as per Nekresh's answer.




回答2:


As described here: 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);



回答3:


If you really need a CDATA section (see Jon's answer), you can achieve that like so:

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

This will replace the contents of xnode, not append to it.




回答4:


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



回答5:


Use Node.InnerXml, not Node.InnerText. Node.InnerText is automatically replacing special values. Note that if you specify with CDATA in InnerXml, then Node.InnerText is text in CDATA. Example:

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

Program's output:

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



回答6:


You can use writer.WriteCData(value);

where writer is XmlWriter object.



来源:https://stackoverflow.com/questions/4679543/how-to-write-cdata-in-xml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!