C#中XmlDocument保存XML时如何将转义内容转为CDATA格式?
解决C#中XmlDocument转义内容转CDATA保存的问题
要解决这个问题,核心是先把<comprobante>节点内的转义内容解码为原始XML字符串,再用CDATA节点替换原有内容,最后保存文档。具体步骤如下:
步骤说明
- 获取并解码转义内容:利用
XmlNode.InnerText属性自动解码转义字符(如&lt;会被还原为<),得到原始的XML内容。 - 替换为CDATA节点:清空目标节点的现有内容,创建CDATA节点并将解码后的内容放入其中,再将CDATA节点添加到目标节点下。
- 保存文档:此时调用
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
相关产品推荐
相关产品推荐

