C# Xml序列化:定义含重复元素数组的属性类问题
解决XML多重复元素的属性类定义问题
嘿,我来帮你搞定这个WebService里的XML序列化属性类定义问题!你的核心困惑在于如何让多个<Type3>元素直接出现在<Parent>节点下,而不是被包裹在一个数组容器里,咱们一步步来解决:
首先,先明确你要匹配的XML结构:
<Parent> <Type1>int</Type1> <Type2>string</Type2> <Type3>Object</Type3> <Type3>Object</Type3> <Type3>Object</Type3> <Type3>Object</Type3> </Parent>
这里的<Type3>是直接作为<Parent>的同级子元素重复出现的,而不是嵌套在类似<Type3s>这样的容器节点里——这就是你之前用[XmlArray]不对的原因,因为[XmlArray]会自动生成一个包裹容器,不符合你的需求。
正确的属性类定义代码
直接把List类型的属性标记为[XmlElement("Type3")]就可以了,完整代码如下:
[XmlRoot("Parent")] public class Parent { [XmlElement("Type1")] public int Type1 { get; set; } [XmlElement("Type2")] public string Type2 { get; set; } // 关键:用XmlElement特性标记List,生成多个同级的<Type3>元素 [XmlElement("Type3")] public List<YourObjectType> Type3Items { get; set; } = new List<YourObjectType>(); }
关键说明
- 对于单个出现的元素(
Type1、Type2),用[XmlElement]标记完全没问题,序列化后会直接生成对应的节点。 - 对于重复的
<Type3>元素,绝对不能用[XmlArray]——它会生成类似<Type3Items><Type3>...</Type3></Type3Items>的嵌套结构,和你的目标XML不符。而用[XmlElement("Type3")]标记List属性时,XML序列化器会直接在<Parent>节点下生成多个同级的<Type3>元素,完美匹配你要的结构。
测试序列化效果
如果你实例化这个类并序列化,比如:
var parent = new Parent { Type1 = 123, Type2 = "Hello WebService", Type3Items = new List<YourObjectType> { new YourObjectType(), new YourObjectType(), new YourObjectType(), new YourObjectType() } }; var serializer = new XmlSerializer(typeof(Parent)); using var writer = new StringWriter(); serializer.Serialize(writer, parent); var outputXml = writer.ToString();
生成的XML就会和你给出的结构完全一致,多个<Type3>直接放在<Parent>下面。
记得把代码里的YourObjectType替换成你实际使用的对象类型(比如自定义的实体类)哦!
内容的提问来源于stack exchange,提问作者Nagaraja Malla
相关产品推荐
相关产品推荐

