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

C#对象XML序列化:如何忽略PartnerIdInfo类标签生成指定XML结构

如何序列化出无包裹标签的交替PartnerID/PartnerIDType元素

你需要生成的目标XML结构如下:

<Partners>
   <Partner>
      <PartnerType>SomeStringValue</PartnerType>
      <PartnerID>SomeStringValue</PartnerID>
      <PartnerIDType>SomeStringValue</PartnerIDType>
      <PartnerID>BTW BEXXXXXXXXXX</PartnerID>
      <PartnerIDType>SomeStringValue</PartnerIDType>
   </Partner>
   <Partner>
      <PartnerType>SomeStringValue</PartnerType>
      <PartnerID>SomeStringValue</PartnerID>
      <PartnerIDType>SomeStringValue</PartnerIDType>
      <PartnerID>BTW BEXXXXXXXXXX</PartnerID>
      <PartnerIDType>SomeStringValue</PartnerIDType>
   </Partner>
</Partners>

此前你尝试用PartnerIdInfo列表结合[XmlElement("PartnerIdInfo")]属性,但序列化后仍会生成<PartnerIdInfo>包裹节点,不符合需求。以下是无需手动操作XmlDocument的解决方案:

方案一:使用XmlChoiceIdentifierAttribute实现交替元素输出

通过枚举标记元素类型,配合属性配置直接输出交替的<PartnerID>和<PartnerIDType>元素:

  1. 定义元素类型枚举:
public enum PartnerElementChoice
{
    PartnerID,
    PartnerIDType
}
  1. 修改Partner类:
public class Partner
{
    public string PartnerType { get; set; }

    [XmlChoiceIdentifier("PartnerElementChoices")]
    [XmlElement("PartnerID", typeof(string))]
    [XmlElement("PartnerIDType", typeof(string))]
    public List<string> PartnerElements { get; set; }

    [XmlIgnore]
    public List<PartnerElementChoice> PartnerElementChoices { get; set; }
}
  1. 使用时成对添加元素与对应枚举值:
var partner = new Partner
{
    PartnerType = "SomeStringValue",
    PartnerElements = new List<string>
    {
        "SomeStringValue",
        "SomeStringValue",
        "BTW BEXXXXXXXXXX",
        "SomeStringValue"
    },
    PartnerElementChoices = new List<PartnerElementChoice>
    {
        PartnerElementChoice.PartnerID,
        PartnerElementChoice.PartnerIDType,
        PartnerElementChoice.PartnerID,
        PartnerElementChoice.PartnerIDType
    }
};

序列化后即可得到目标结构,元素直接在<Partner>节点下交替出现,无额外包裹标签。

方案二:实现IXmlSerializable接口手动控制序列化

如果需要更灵活的逻辑控制,可让Partner类实现IXmlSerializable接口,通过XmlWriter直接输出目标结构:

public class Partner : IXmlSerializable
{
    public string PartnerType { get; set; }
    public List<PartnerIdInfo> PartnerIDInfos { get; set; } = new List<PartnerIdInfo>();

    public XmlSchema GetSchema() => null;

    public void ReadXml(XmlReader reader)
    {
        // 按需实现反序列化逻辑
        reader.ReadStartElement("Partner");
        PartnerType = reader.ReadElementContentAsString("PartnerType", "");
        
        while (reader.NodeType != XmlNodeType.EndElement)
        {
            if (reader.Name == "PartnerID")
            {
                var info = new PartnerIdInfo();
                info.PartnerID = reader.ReadElementContentAsString();
                info.PartnerIDType = reader.ReadElementContentAsString("PartnerIDType", "");
                PartnerIDInfos.Add(info);
            }
            else
            {
                reader.Skip();
            }
        }
        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteElementString("PartnerType", PartnerType);
        foreach (var info in PartnerIDInfos)
        {
            writer.WriteElementString("PartnerID", info.PartnerID);
            writer.WriteElementString("PartnerIDType", info.PartnerIDType);
        }
    }
}

这种方式无需依赖自动序列化的属性限制,完全自定义输出格式,且不需要手动操作XmlDocument或XmlNode。


内容的提问来源于stack exchange,提问作者D. Brugmans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:40:30