C#处理XML的CDATA需用XmlCDataSection写入并显式判断NodeType读取:写入时调用CreateCDataSection创建节点后追加到元素;读取时检查NodeType为CDATA后取Value属性获取原始内容。

在C#中处理XML的CDATA片段,关键在于使用XmlCDataSection节点类型进行写入,而读取时则需识别节点类型并提取Value属性——它会自动包含CDATA内原始内容(不带标签)。
写入CDATA:用CreateCDataSection创建并追加
使用XmlDocument或XDocument均可,但XmlDocument更直观支持CDATA节点操作:
- 调用
doc.CreateCDataSection("原始文本")生成CDATA节点 - 将该节点作为子节点添加到目标元素(如
element.AppendChild(cdataNode)) - 注意:不能用
InnerText或InnerXml直接赋值CDATA,否则会被转义为普通文本
读取CDATA:检查NodeType并获取Value
遍历节点时,需判断node.NodeType == XmlNodeType.CDATA:
- 匹配后直接读取
node.Value,即CDATA内部未转义的原始字符串 - 若误用
node.InnerText,结果相同(因InnerText会合并所有子文本节点),但语义不明确;推荐显式判断类型 - 示例:
if (n.NodeType == XmlNodeType.CDATA) Console.WriteLine(n.Value);
用XDocument写入CDATA:需借助XText和转义控制
XDocument本身没有原生CDATA节点类型,但可通过以下方式模拟:
- 将内容包裹在
XText中,并确保父元素的ToString()输出时保留CDATA(实际需配合SaveOptions.DisableFormatting和手动拼接,不推荐) - 更稳妥做法:仍用
XmlDocument完成CDATA操作,再转为XDocument(如需后续LINQ查询) - 或改用
XmlWriter,调用WriteCData("内容")方法直接输出
常见陷阱与验证建议
CDATA易被忽略的细节会影响XML合法性或解析行为:
- CDATA段内不能出现
]]>序列,否则会导致解析中断;写入前应预处理替换(如转为]]>拼接) - 用
XmlReader读取时,默认会将CDATA合并进Text节点,需设置XmlReaderSettings.DtdProcessing = DtdProcessing.Parse并启用XmlResolver才可能保留节点结构(通常不必要) - 验证是否成功写入:保存后打开XML文件,确认目标位置显示为
而非转义后的zuojiankuohaophpcn等字符










