You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中XmlDocument保存XML时如何将转义内容转为CDATA格式?

解决C#中XmlDocument转义内容转CDATA保存的问题

要解决这个问题,核心是先把<comprobante>节点内的转义内容解码为原始XML字符串,再用CDATA节点替换原有内容,最后保存文档。具体步骤如下:

步骤说明

  1. 获取并解码转义内容:利用XmlNode.InnerText属性自动解码转义字符(如&amp;lt;会被还原为<),得到原始的XML内容。
  2. 替换为CDATA节点:清空目标节点的现有内容,创建CDATA节点并将解码后的内容放入其中,再将CDATA节点添加到目标节点下。
  3. 保存文档:此时调用XmlDocument.Save()时,CDATA内的内容会被原样保留,不会再次转义。

代码示例

// 加载现有XML文档
XmlDocument doc = new XmlDocument();
doc.Load("input.xml"); // 也可从内存流等其他来源加载

// 定位到<comprobante>节点
XmlNode comprobanteNode = doc.SelectSingleNode("//comprobante");
if (comprobanteNode != null)
{
    // 获取解码后的原始XML内容
    string rawXmlContent = comprobanteNode.InnerText;
    
    // 清空节点原有内容
    comprobanteNode.RemoveAll();
    
    // 创建CDATA节点并添加到目标节点
    XmlCDataSection cdataSection = doc.CreateCDataSection(rawXmlContent);
    comprobanteNode.AppendChild(cdataSection);
    
    // 保存处理后的文档
    doc.Save("output.xml");
}

关键注意点

  • 必须使用InnerText而非InnerXml:InnerXml会尝试将转义内容解析为XML节点,而我们需要的是完整的原始字符串;InnerText则会直接解码所有转义字符,返回纯文本形式的原始内容。
  • 清空节点内容:如果<comprobante>节点原本有子节点,RemoveAll()会确保旧内容被完全清除,避免CDATA节点和原有内容共存。

内容的提问来源于stack exchange,提问作者Luis Andaluz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 18:05:00