我正在将以下XML文档反序列化为c#类:
<Station>
<station_id>KMSP</station_id>
<wmo_id>72658</wmo_id>
<latitude>44.88</latitude>
<longitude>-93.23</longitude>
<elevation_m>255.0</elevation_m>
<site>MINNEAPOLIS</site>
<state>MN</state>
<country>US</country>
<site_type>
<METAR />
<TAF />
</site_type>
</Station>
这是它被反序列化到的类:
public class Station
{
[XmlElement(ElementName ="station_id")]
public string StationId { get; set; }
[XmlElement(ElementName = "wmo_id")]
public string WmoId { get; set; }
[XmlElement(ElementName ="latitude")]
public double Latitude { get; set; }
[XmlElement(ElementName = "longtitude")]
public double Longtitude { get; set; }
[XmlElement(ElementName="site")]
public string Site { get; set; }
[XmlElement(ElementName ="state")]
public string State { get; set; }
[XmlElement(ElementName ="country")]
public string Country { get; set; }
[XmlElement(ElementName = "site_type")]
public string[] SiteType { get; set; }
}
除了<METAR />
格式。当我试图反序列化这个XML时,我得到一个ReadElementContentAs()错误,并且我99%确定是该标记导致了这个问题。有没有人知道我哪里错了,或者有什么建议关于如何反序列化这种元素?
谢谢!
考虑你对这个答案的评论
为了澄清,
SiteType
中的这些类型标记将永远不会像其他标记一样包含任何数据。如果标签存在,则表示该气象站生成该类型的报告(METAR
,TAF
,SIGMENTS
等)
SiteType
不是字符串数组,而是类型数组,每种报告类型都有不同的数组。它们共享同一个基类。
public abstract class SiteType
{ }
public class Metar : SiteType
{ }
public class Taf : SiteType
{ }
那么SiteType
属性如下所示
[XmlArray(ElementName = "site_type")]
[XmlArrayItem(typeof(Metar), ElementName ="METAR")]
[XmlArrayItem(typeof(Taf), ElementName = "TAF")]
public SiteType[] SiteType { get; set; }
要检查某个站点是否支持某种报告类型,请检查该SiteType
数组中是否存在相应类型。
var hasMetar = p.SiteType.Any(o => o.GetType() == typeof(Metar));
你可以这样声明一个属性:
[XmlAnyElement(Name = "site_type")]
public XmlElement SiteType { get; set; }
反序列化后,属性中将有一个节点集合。
foreach(XmlNode node in station.SiteType.ChildNodes)
Console.WriteLine(node.Name);