XML反序列化错误ReadElementContentAs()



我正在将以下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);

相关内容

  • 没有找到相关文章

最新更新