如何在xml中编写CData

时间:2011-01-13 11:29:48

标签: c# xml

我有一个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"]) + " ]]>" ;    

但它的变化“&lt;” CDATA的“&amp; lt”。 请告诉我如何将上面的xml中的值填充为CData格式。

我知道我们可以创建CDATA:

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

但我的过程是读取xml的节点并更改其值而不是附加在其中。 感谢

6 个答案:

答案 0 :(得分:18)

如下所述: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);

答案 1 :(得分:17)

真的是否需要它在CDATA中,或者你只是想以一种不需要在你的代码中额外转义的方式获取文本?

InnerText执行任何需要的转义,所以通常我只使用

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

...但是如果你真的想要一个CDATA node,你可以根据Nekresh的回答自己创建一个。

答案 2 :(得分:11)

如果你真的需要一个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的内容,而不是附加到其中。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

使用Node.InnerXml,而不是Node.InnerText。 Node.InnerText自动替换特殊值。请注意,如果在InnerXml中使用CDATA指定,则Node.InnerText是CDATA中的文本。 例如:

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>

答案 5 :(得分:0)

您可以使用writer.WriteCData(value);

其中writer是XmlWriter object。