如何在C#中将数组序列化为带动态标签名的XML
实现动态标签名的XML序列化(C#)
当然可行!默认的XmlSerializer依赖编译时的特性配置,没法直接生成带动态索引的标签名,但我们可以通过自定义序列化逻辑来实现这个需求——刚好你不需要反序列化,实现起来更简单。
下面给你两种实用的方案:
方案1:实现IXmlSerializable接口自定义序列化
修改GeneralInformation类,实现IXmlSerializable接口,在WriteXml方法里手动控制每个元素的标签名:
using System.Xml; using System.Xml.Serialization; [XmlRoot(IsNullable = false)] public class GeneralInformation : IXmlSerializable { private Info[] addInfoList; public Info[] AddInfoList { get { return this.addInfoList; } set { this.addInfoList = value; } } // 反序列化方法不需要实现(因为你不需要反序列化),直接留空 public void ReadXml(XmlReader reader) { throw new NotImplementedException("反序列化未实现"); } public System.Xml.Schema.XmlSchema GetSchema() { return null; } public void WriteXml(XmlWriter writer) { writer.WriteStartElement("InfoList"); if (AddInfoList != null) { for (int i = 0; i < AddInfoList.Length; i++) { // 生成带三位索引的标签名:Info001、Info002... string elementName = $"Info{(i + 1).ToString("D3")}"; writer.WriteStartElement(elementName); // 序列化Info对象的内容 XmlSerializer infoSerializer = new XmlSerializer(typeof(Info)); infoSerializer.Serialize(writer, AddInfoList[i]); writer.WriteEndElement(); } } writer.WriteEndElement(); } } public class Info { private string infoMessage; [XmlElement("InfoName")] public string InfoMessage { get { return this.infoMessage; } set { this.infoMessage = value; } } }
方案2:手动构建XML文档(更灵活,适合仅序列化场景)
如果你不想修改原有类的结构,可以直接用XmlWriter手动拼接整个XML结构,完全控制每个标签的生成:
using System.IO; using System.Xml; public static string SerializeToDynamicXml(GeneralInformation data) { StringWriter stringWriter = new StringWriter(); XmlWriterSettings settings = new XmlWriterSettings { Indent = true, Encoding = System.Text.Encoding.Unicode // 对应你示例中的utf-16 }; using (XmlWriter writer = XmlWriter.Create(stringWriter, settings)) { writer.WriteStartDocument(); writer.WriteStartElement("GeneralInformation"); writer.WriteAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); writer.WriteAttributeString("xmlns:xsd", "http://www.w3.org/2001/XMLSchema"); writer.WriteStartElement("InfoList"); if (data.AddInfoList != null) { for (int i = 0; i < data.AddInfoList.Length; i++) { string elementName = $"Info{(i + 1).ToString("D3")}"; writer.WriteStartElement(elementName); writer.WriteElementString("InfoName", data.AddInfoList[i].InfoMessage); writer.WriteEndElement(); } } writer.WriteEndElement(); // 关闭InfoList writer.WriteEndElement(); // 关闭GeneralInformation writer.WriteEndDocument(); } return stringWriter.ToString(); }
使用示例
// 测试数据 var generalInfo = new GeneralInformation { AddInfoList = new[] { new Info { InfoMessage = "Test1" }, new Info { InfoMessage = "Test2" }, new Info { InfoMessage = "Test3" } } }; // 用方案2序列化 string xmlResult = SerializeToDynamicXml(generalInfo); Console.WriteLine(xmlResult);
这段代码会生成你期望的XML结构,每个子元素标签都是Info001、Info002这种带索引的格式。
内容的提问来源于stack exchange,提问作者Nielson R. O.
相关产品推荐
相关产品推荐

