如何为List 实现设置XmlArrayItem元素名称?
我想创建一个自定义XML结构,如下所示:
为了能够做到这一点,我创建了List
的实现。 我的代码如下:
[XmlRootAttribute(ElementName="Hotels")] public class HotelList: List
因为List所持有的类不是名为Hotel
而是HotelBasic
我的xml就像
如何在不必实现ISerializable
或IEnumerable
情况下解决这个问题?
假设您正在使用XmlSerializer
,如果您要做的只是更改HotelBasic
类的序列化方式,您可以使用XmlTypeAttribute
:
[XmlType(TypeName = "Hotel")] public class HotelBasic { public string Name { get; set; } }
与HotelList
类一起使用时,它将被序列化为:
One Two
[XmlArray("Hotels")] [XmlArrayItem(typeof(Hotel), ElementName="Hotel")] public HotelList[] Messages { get; set; }
应该产生:
[XmlRoot("Hotels")] public class HotelList : IXmlSerializable { public System.Xml.Schema.XmlSchema GetSchema() { return null; } public void ReadXml(XmlReader reader) { this.Hotels = XDocument.Load(reader) .Select(h => new Hotel { Name = (string)h.Attribute("name") } .ToList(); } public void WriteXml(XmlWriter writer) { throw new NotSupportedException(); } }
我认为madd0在这里显示了最简单的选项,但仅仅是为了完整性……我个人不推荐“将列表序列化为根对象” – 出于各种原因(包括:我看到这些属性不起作用)至少在平台上 – 可能是CF或SL,不记得了)。 相反,我总是建议使用自定义根类型:
[XmlRoot("Hotels")] public class HotelResult // or something similar { [XmlElement("Hotel")] public List Hotels { get { return hotel; } } private readonly List hotels = new List (); }
这将具有相同的xml结构,并允许更大的灵活性(您可以向根添加其他属性/元素),并且不会将List
烘焙到您的类型模型中(更喜欢封装而不是inheritance等)。