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

如何在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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:35:35