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>元素:
- 定义元素类型枚举:
public enum PartnerElementChoice { PartnerID, PartnerIDType }
- 修改
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; } }
- 使用时成对添加元素与对应枚举值:
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
相关产品推荐
相关产品推荐

