2012-11-13 73 views
2

又一个XML反序列化问题。XML反序列化返回空数组

我检查了其他几个线程,并尝试了大多数解决方案,但无济于事。 我收到的XML不能被改装成的(或至少不容易),在这里它是:

<?xml version=\"1.0\" encoding=\"UTF-8\"?> 
<ActueleVertrekTijden> 
    <VertrekkendeTrein> 
     <RitNummer>37047</RitNummer> 
     <VertrekTijd>2012-11-13T15:40:00+0100</VertrekTijd> 
     <EindBestemming>Sneek</EindBestemming> 
     <TreinSoort>Stoptrein</TreinSoort> 
     <Vervoerder>Arriva</Vervoerder> 
     <VertrekSpoor wijziging=\"false\">3</VertrekSpoor> 
    </VertrekkendeTrein> 
    <VertrekkendeTrein> 
     <RitNummer>10558</RitNummer> 
     <VertrekTijd>2012-11-13T15:46:00+0100</VertrekTijd> 
     <EindBestemming>Rotterdam Centraal</EindBestemming> 
     <TreinSoort>Intercity</TreinSoort> 
     <RouteTekst>Heerenveen, Steenwijk, Utrecht C</RouteTekst> 
     <Vervoerder>NS</Vervoerder> 
     <VertrekSpoor wijziging=\"false\">4</VertrekSpoor> 
    </VertrekkendeTrein> 
    <VertrekkendeTrein> 
     <RitNummer>37349</RitNummer> 
     <VertrekTijd>2012-11-13T15:59:00+0100</VertrekTijd> 
     <EindBestemming>Groningen</EindBestemming> 
     <TreinSoort>Sneltrein</TreinSoort> 
     <RouteTekst>Buitenpost</RouteTekst> 
     <Vervoerder>Arriva</Vervoerder> 
     <VertrekSpoor wijziging=\"false\">5b</VertrekSpoor> 
    </VertrekkendeTrein> 
</ActueleVertrekTijden> 

有多个元素(总是的10 minumum)

现在,这些都是我的班反序列化:

[Serializable, XmlRoot(ElementName="ActueleVertrekTijden", DataType="VertrekkendeTrein", IsNullable=false)] 
public class ActueleVertrekTijden 
{ 
    [XmlArray("ActueleVertrekTijden")] 
    public VertrekkendeTrein[] VertrekLijst { get; set; } 
} 

[Serializable] 
public class VertrekkendeTrein 
{ 
    [XmlElement("RitNummer")] 
    public string RitNummer { get; set; } 
    [XmlElement("VertrekTijd")] 
    public string VertrekTijd { get; set; } 
    [XmlElement("EindBestemming")] 
    public string EindBestemming { get; set; } 
    [XmlElement("Vervoerder")] 
    public string Vervoerder { get; set; } 
    [XmlElement("VertrekSpoor")] 
    public string VertrekSpoor { get; set; } 
} 

我暂时忽略了其他人。我添加了XmlRoot部分,因为我得到了“xmlsn =” - 错误。所以不得不设置XmlRoot。

现在解串器:

 public ActueleVertrekTijden Deserialize<ActueleVertrekTijden>(string s) 
    { 
     var ser = new XmlSerializer(typeof(ActueleVertrekTijden)); 
     ActueleVertrekTijden list = (ActueleVertrekTijden)ser.Deserialize(new StringReader(s)); 

     return list; 
    } 

它返回一个ActueleVertrekTijden类,但VertrekLijst阵列保持为空

+0

我可能是错的,但我不认为你想XmlRoot'的'了'DataType'属性设置为。你可以尝试只设置'ElementName'?我认为它不一定会解决它,但只是注意到它。 –

+3

当我尝试反序列化外部XML时,我尝试序列化它的类表示,然后将其与我接收的外部XML进行比较。 .NET'XmlSerializer'的工作方式通常会有一些小混乱或者忽略/遗忘。尝试在您的应用程序中创建一个包含数据的ActueleVertrekTijden样本,将其序列化为XML,并将其与您尝试反序列化的源XML的差异进行比较。 –

+0

这是一个好主意(现在我为什么没有想到自己)。 –

回答

2

你需要省略包装命名空间,因为你的数组元素的容器ActueleVertrekTijden正下方出现类,没有任何收集wrapper元素。即改变

[XmlArray("ActueleVertrekTijden")] 
public VertrekkendeTrein[] VertrekLijst { get; set; } 

[XmlElement("VertrekkendeTrein")] 
public VertrekkendeTrein[] VertrekLijst { get; set; } 

参考here

+1

它的工作,谢谢。 就像在另一个线程中提到的:“如何反直觉!”我不会很快就知道这一点(也许经过试验和错误测试:P) –