C#怎么在XML中读写CDATA片段

23次阅读

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

C#怎么在XML中读写CDATA片段

在C#中处理XML的CDATA片段,关键在于使用XmlCDataSection节点类型进行写入,而读取时则需识别节点类型并提取Value属性——它会自动包含CDATA内原始内容(不带标签)。

写入CDATA:用CreateCDataSection创建并追加

使用XmlDocumentXDocument均可,但XmlDocument更直观支持CDATA节点操作:

  • 调用doc.CreateCDataSection("原始文本")生成CDATA节点
  • 将该节点作为子节点添加到目标元素(如element.appendChild(cdataNode)
  • 注意:不能用InnerTextInnerXml直接赋值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等字符
text=ZqhQzanResources