如何为列表设置XmlArrayItem元素名称<;自定义>;实施
本文关键字:lt 自定义 实施 gt 列表 设置 元素 XmlArrayItem | 更新日期: 2023-09-27 18:15:40
我想创建一个自定义的XML结构,如下所示:
<Hotels>
<Hotel />
</Hotels>
我创建了一个List
的实现,就是为了能够做到这一点。我的代码如下:
[XmlRootAttribute(ElementName="Hotels")]
public class HotelList: List<HotelBasic>
因为List持有的类不是Hotel
,而是HotelBasic
,所以我的xml就像
<Hotels>
<HotelBasic />
</Hotels>
如何在不必实现ISerializable
或IEnumerable
的情况下解决此问题?
[XmlArray("Hotels")]
[XmlArrayItem(typeof(Hotel), ElementName="Hotel")]
public HotelList[] Messages { get; set; }
应产生:
<Hotels>
<Hotel />
<Hotel />
</Hotels>
[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();
}
}
假设您使用的是XmlSerializer
,如果您只想更改HotelBasic
类的序列化方式,则可以使用XmlTypeAttribute
:
[XmlType(TypeName = "Hotel")]
public class HotelBasic
{
public string Name { get; set; }
}
当与HotelList
类一起使用时,它将被序列化为:
<Hotels xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Hotel>
<Name>One</Name>
</Hotel>
<Hotel>
<Name>Two</Name>
</Hotel>
</Hotels>
我认为madd0在这里为您展示了最简单的选项,但只是为了完整性。。。就我个人而言,我不建议使用"将列表序列化为根对象",原因有很多(包括:我看到这些属性至少在平台上不起作用,可能是CF或SL,记不清了(。相反,我总是建议使用自定义根类型:
[XmlRoot("Hotels")]
public class HotelResult // or something similar
{
[XmlElement("Hotel")]
public List<HotelBasic> Hotels { get { return hotel; } }
private readonly List<HotelBasic> hotels = new List<HotelBasic>();
}
这将具有相同的xml结构,并允许更大的灵活性(您可以向根添加其他属性/元素(,并且不会将List<T>
烘焙到您的类型模型中(更喜欢封装而不是继承等(。