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