在 LINQ to XML 中必须使用 XCData 类创建 CDATA 节点,因其专用于表示 CDATA 区段且会自动序列化为标准格式;不能用于属性,读取时需通过 node is XCData 判断类型。

在 C# 的 LINQ to XML 中,不能直接用 XElement 或 XAttribute 创建 CDATA 节点,因为 LINQ to XML 默认将文本内容视为普通文本节点(XText),会自动转义特殊字符(如 、&)。要生成真正的 内容,必须使用 XCData 类。
使用 XCData 创建 CDATA 节点
XCData 是专门用于表示 CDATA 区段的 LINQ to XML 类型。它继承自 XNode,可作为子节点添加到 XElement 中。
- 构造时传入字符串内容(无需手动拼接
) - 序列化时会自动输出标准 CDATA 格式
- 只能用于元素内容,不能用于属性值(XML 规范本身不支持属性含 CDATA)
基本写法示例
以下代码创建一个包含 CDATA 的 XML 元素:
XElement root = new XElement("root",
new XElement("content",
new XCData(" & special chars")
)
);
Console.WriteLine(root.ToString());
输出结果为:
alert('hello'); & special chars]]>
常见注意事项
-
不要用字符串拼接模拟 CDATA:例如
new XElement("node", "")会导致内容被当作普通文本,和&被双重转义,最终不是有效 CDATA -
XCData 不影响查询或遍历逻辑:读取时,
XElement.Value仍返回解码后的内容(与普通文本一致),若需区分原始 CDATA,应检查节点类型:node is XCData -
保存时默认保留 CDATA:使用
XDocument.Save()或XElement.ToString()时,XCData节点会正确序列化为 CDATA 区段
读取时识别 CDATA 节点
若需在解析已有 XML 时判断某文本是否来自 CDATA,可遍历子节点并检查类型:
XElement elem = XElement.Parse("bold]]>");
foreach (XNode node in elem.Nodes())
{
if (node is XCData cdata)
{
Console.WriteLine($"Found CDATA: '{cdata.Value}'");
// 输出:Found CDATA: 'bold'
}
}










