如何使用XmlSerializer序列化包含CDATA段的XML文件?
用XmlSerializer生成包含CDATA段的XML文件
要生成包含CDATA段的XML,你需要给要放入CDATA的内容自定义序列化逻辑,具体步骤如下:
1. 定义实体类与CDATA包装类
先创建对应XML结构的实体类,同时定义一个实现IXmlSerializable的包装类,用来处理CDATA的写入:
// 对应根节点<root> public class Root { // 对应CDATA段的内容,用自定义包装类 [XmlText] public CDataWrapper InfoCData { get; set; } // 对应标准标签<info2> public Info2 Info2 { get; set; } } // 对应<info2>的结构 public class Info2 { public string Prop1 { get; set; } } // 自定义CDATA包装类,负责生成CDATA段 public class CDataWrapper : IXmlSerializable { // 存储要放入CDATA的XML内容 public string Content { get; set; } public System.Xml.Schema.XmlSchema GetSchema() => null; public void ReadXml(System.Xml.XmlReader reader) { // 反序列化时读取CDATA内容(按需实现) Content = reader.ReadElementContentAsString(); } public void WriteXml(System.Xml.XmlWriter writer) { // 写入CDATA段 writer.WriteCData(Content); } }
2. 构造数据并序列化
先将需要放入CDATA的<info>部分序列化为字符串,再将整个Root对象序列化到文件:
// 1. 构造<info>的内容并序列化为字符串 var infoData = new { Number = 12, Files = 1 }; var infoSerializer = new XmlSerializer(infoData.GetType()); string infoXml; // 去掉默认命名空间,让CDATA内的格式更干净 var ns = new XmlSerializerNamespaces(); ns.Add("", ""); using (var sw = new StringWriter()) { infoSerializer.Serialize(sw, infoData, ns); infoXml = sw.ToString(); // 移除自动生成的XML声明 infoXml = infoXml.Replace(@"<?xml version=""1.0"" encoding=""utf-16""?>", ""); } // 2. 构造Root对象 var root = new Root { InfoCData = new CDataWrapper { Content = infoXml }, Info2 = new Info2 { Prop1 = "prop1" } }; // 3. 序列化Root到目标文件 var rootSerializer = new XmlSerializer(typeof(Root)); using (var writer = new StreamWriter("output.xml")) { rootSerializer.Serialize(writer, root); }
效果说明
运行上述代码后,生成的XML会和你需要的格式一致:<root>下包含CDATA包裹的<info>内容,以及标准格式的<info2>标签。
内容的提问来源于stack exchange,提问作者Rafael Ribeiro
相关产品推荐
相关产品推荐

