在C#中创建CDATA节点须使用XCData类显式包装内容并作为XElement子节点添加,不能直接用字符串或赋值给Value属性;示例:new XElement("description", new XCData("Hello & World!"))。

在C#中用LINQ to XML创建带CDATA的节点,关键不是直接用XElement,而是要用XCData类显式包装内容,并作为子节点添加到目标元素中。
正确创建CDATA节点的方法
XCData是专门用于表示CDATA节的类型,它必须作为XElement的子节点存在,不能直接作为根或独立对象写入文档。常见错误是试图把字符串直接标记为CDATA,其实必须“包裹”进去。
- 创建一个
XElement(比如) - 用
new XCData("你的HTML或特殊字符")构造CDATA内容 - 把这个
XCData对象传给XElement的构造函数或用Add()方法添加
完整代码示例
下面这段代码生成一个包含CDATA的XML片段:
var doc = new XDocument(
new XElement("root",
new XElement("description",
new XCData("Hello & World!"))));
Console.WriteLine(doc.ToString());
输出结果会是:
Hello & World!]]>
注意:原始字符串中的和&不会被转义——这正是CDATA的作用。
常见误区提醒
-
不要对字符串调用
.ToString()再塞进XElement——那只是普通文本,会被自动转义 -
不要用
XElement.Value = new XCData(...)——Value只接受字符串,赋值会调用ToString()丢掉CDATA语义 - 如果已有
XElement,可用element.Add(new XCData("..."))追加,但注意CDATA会成为子节点;若想替换全部内容,先element.RemoveAll()再Add()
配合属性和其他节点一起使用
CDATA可以和普通子元素、属性共存:
var item = new XElement("item",
new XAttribute("id", "101"),
new XElement("title", "Intro"),
new XElement("body",
new XCData("First para
")));
这样生成的内就是纯CDATA,而id和title仍是标准XML结构。
基本上就这些。核心就一条:用XCData实例,别用字符串硬凑。









