C# Linq to XML如何创建CDATA节点

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

在 C# 的 LINQ to XML 中,不能直接用 XElementXAttribute 创建 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());

输出结果为:


  

常见注意事项

  • 不要用字符串拼接模拟 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'
    }
}