XML反序列化返回空数组

4

又一个关于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个)

现在我正在反序列化以下这些类:

[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数组仍然为空。

我可能错了,但我认为您不想将XmlRootDataType属性设置为那个值。您能否尝试仅设置ElementName?我不认为这一定会解决问题,但我只是注意到了它。 - Chris Sinclair
3
当我尝试反序列化外部XML时遇到问题,我会尝试将其类表示序列化,然后将其与我接收到的外部XML进行比较。通常情况下,.NET XmlSerializer的工作可能存在小混淆或疏忽/遗忘。请使用您的应用程序创建一个带有数据的示例“ActueleVertrekTijden”,将其序列化为XML,并将其差异与您尝试反序列化的源XML进行比较。 - Chris Sinclair
这是个好主意(现在为什么我自己没想到呢)。 - Sjaak van der Heide
1个回答

5
您需要省略包装器命名空间,因为您的数组元素直接出现在容器类ActueleVertrekTijden下面,没有任何集合wrapper元素。即改为

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

to

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

Reference here


1
它起作用了,谢谢。就像在另一个线程中提到的那样:“多么反直觉!”我自己不会很快想出来(也许需要试错测试:P) - Sjaak van der Heide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接