【问题标题】:XML Deserialization returns empty arrayXML 反序列化返回空数组
【发布时间】:2012-11-14 00:15:53
【问题描述】:

又一个 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吗?我认为它不一定会解决它,但只是注意到它。
  • 当我在尝试反序列化外部 XML 时遇到问题时,实际上我会尝试序列化它的类表示,然后将其与我收到的外部 XML 进行比较。 .NET XmlSerializer 的工作方式经常会出现轻微的混淆或疏忽/健忘。尝试使用您的应用程序创建带有数据的示例ActueleVertrekTijden,将其序列化为 XML,并将其与您尝试反序列化的源 XML 进行比较。
  • 这是个好主意(现在为什么我自己没有想到)。

标签: c# xml xml-serialization


【解决方案1】:

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

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

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

参考here

【讨论】:

  • 成功了,谢谢。就像在另一个线程中提到的那样:“多么反直觉!”我自己不会很快弄清楚这一点(也许经过反复试验:P)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多