2016-11-30 1 views
0

J'ai quelques problèmes pour désérialiser mon code XML en classe.Désérialise les éléments XML

C'est le XML:

<?xml version="1.0" encoding="utf-8" ?> 
<InterestRates> 

    <!--Type A --> 
    <InterestRates_A> 
    <InterestRate_A> 
     <ValidFrom></ValidFrom> 
     <ValidTo>2004-12-31</ValidTo> 
     <Rate>0.00000</Rate> 
    </InterestRate_A> 
    <InterestRate_A> 
     <ValidFrom>2005-01-01</ValidFrom> 
     <ValidTo>2005-12-31</ValidTo> 
     <Rate>0.04247</Rate> 
    </InterestRate_A> 
    <InterestRate_A> 
     <ValidFrom>2005-01-01</ValidFrom> 
     <ValidTo>2005-12-31</ValidTo> 
     <Rate>0.04247</Rate> 
    </InterestRate_A> 
    <InterestRate_A> 
     <ValidFrom>2006-01-01</ValidFrom> 
     <ValidTo>2006-12-31</ValidTo> 
     <Rate>0.02986</Rate> 
    </InterestRate_A> 
    <InterestRate_A> 
     <ValidFrom>2007-01-01</ValidFrom> 
     <ValidTo>2009-10-30</ValidTo> 
     <Rate>0.02740</Rate> 
    </InterestRate_A> 
    <InterestRate_A> 
     <ValidFrom>2009-10-31</ValidFrom> 
     <ValidTo>2009-10-30</ValidTo> 
     <Rate>0.02470</Rate> 
    </InterestRate_A> 
    </InterestRates_A> 

    <!--Type B --> 
    <InterestRates_B> 
    <InterestRate_B> 
     <ValidFrom>2016-05-01</ValidFrom> 
     <ValidTo></ValidTo> 
     <Rate>0.05</Rate> 
     <Rate2>2.05</Rate2> 
    </InterestRate_B> 
    </InterestRates_B> 

    <!--Type C --> 
    <InterestRates_C> 
    <InterestRate_C> 
     <ValidFrom>2017-01-01</ValidFrom> 
     <ValidTo></ValidTo> 
     <Rate>2</Rate> 
    </InterestRate_C> 
    </InterestRates_C> 

    <!--Type D --> 
    <InterestRates_D> 
    <InterestRate_D> 
     <ValidFrom>2017-01-01</ValidFrom> 
     <ValidTo></ValidTo> 
     <Rate>3</Rate> 
    </InterestRate_D> 
    </InterestRates_D> 

    <!--Type E --> 
    <InterestRates_E> 
    <InterestRate_E> 
     <ValidFrom>2017-01-01</ValidFrom> 
     <ValidTo></ValidTo> 
     <Rate>5</Rate> 
    </InterestRate_E> 
    </InterestRates_E> 

    <!--Type F --> 
    <InterestRates_F> 
    <InterestRate_F> 
     <ValidFrom>2017-01-01</ValidFrom> 
     <ValidTo></ValidTo> 
     <Rate>7</Rate> 
    </InterestRate_F> 
    </InterestRates_F> 

</InterestRates> 

Voici le code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 

namespace Interest 
{ 
    // Root class 
    [XmlRoot("InterestRates")] 
    public class InterestRates 
    { 
     [XmlElement("InterestRates_A")] 
     public InterestRates_A InterestRates_A { get; set; } 

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

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

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

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

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


    [XmlType("InterestRates_A")] 
    public class InterestRates_A 
    { 
    [XmlArrayItem("InterestRate_A", typeof(InterestRate_A))] 
    public InterestRate_A[] InterestRate_A { get; set; } 
    } 

    [XmlType("InterestRates_B")] 
    public class InterestRates_B 
    { 
    [XmlArray("InterestRate_B")] 
    [XmlArrayItem("InterestRate_B", typeof(InterestRate_B))] 
    public InterestRate_B[] InterestRate_B { get; set; } 
    } 

    [XmlType("InterestRates_C")] 
    public class InterestRates_C 
    { 
    [XmlArray("InterestRate_C")] 
    [XmlArrayItem("InterestRate_C", typeof(InterestRate_C))] 
    public InterestRate_C[] InterestRate_C { get; set; } 
    } 

    [XmlType("InterestRates_D")] 
    public class InterestRates_D 
    { 
    [XmlArray("InterestRate_D")] 
    [XmlArrayItem("InterestRate_D", typeof(InterestRate_D))] 
    public InterestRate_D[] InterestRate_D { get; set; } 
    } 

    [XmlType("InterestRates_E")] 
    public class InterestRates_E 
    { 
    [XmlArray("InterestRate_E")] 
    [XmlArrayItem("InterestRate_E", typeof(InterestRate_E))] 
    public InterestRate_E[] InterestRate_E { get; set; } 
    } 

    [XmlType("InterestRates_F")] 
    public class InterestRates_F 
    { 
    [XmlArray("InterestRate_F")] 
    [XmlArrayItem("InterestRate_F", typeof(InterestRate_F))] 
    public InterestRate_F[] InterestRate_F { get; set; } 
    } 


    [Serializable] 
    public class InterestRate_A 
    { 
    [XmlElement("ValidFrom")] 
    public string ValidFrom { get; set; } 

    [XmlElement("ValidTo")] 
    public string ValidTo { get; set; } 

    [XmlElement("Rate")] 
    public string Rate { get; set; } 
    } 

    [Serializable] 
    public class InterestRate_B 
    { 
    [XmlElement("ValidFrom")] 
    public string ValidFrom { get; set; } 

    [XmlElement("ValidTo")] 
    public string ValidTo { get; set; } 

    [XmlElement("Rate")] 
    public string Rate { get; set; } 

    [XmlElement("Rate2")] 
    public string Rate2 { get; set; } 
    } 

    [Serializable] 
    public class InterestRate_C 
    { 
    [XmlElement("ValidFrom")] 
    public string ValidFrom { get; set; } 

    [XmlElement("ValidTo")] 
    public string ValidTo { get; set; } 

    [XmlElement("Rate")] 
    public string Rate { get; set; } 
    } 

    [Serializable] 
    public class InterestRate_D 
    { 
    [XmlElement("ValidFrom")] 
    public string ValidFrom { get; set; } 

    [XmlElement("ValidTo")] 
    public string ValidTo { get; set; } 

    [XmlElement("Rate")] 
    public string Rate { get; set; } 
    } 

    [Serializable] 
    public class InterestRate_E 
    { 
    [XmlElement("ValidFrom")] 
    public string ValidFrom { get; set; } 

    [XmlElement("ValidTo")] 
    public string ValidTo { get; set; } 

    [XmlElement("Rate")] 
    public string Rate { get; set; } 
    } 

    [Serializable] 
    public class InterestRate_F 
    { 
    [XmlElement("ValidFrom")] 
    public string ValidFrom { get; set; } 

    [XmlElement("ValidTo")] 
    public string ValidTo { get; set; } 

    [XmlElement("Rate")] 
    public string Rate { get; set; } 
    } 
} 

Quand je désérialiser le XML dans ma classe racine InterestRates, toutes les collections InterestRate_X sont vides. Comment cela peut-il être réparé?

+2

Alors, quels sont les problèmes? – mybirthname

+0

Qu'est-ce qui ne fonctionne pas correctement? – rbr94

+1

Peut-être que les balises de commentaire Lidaranis

Répondre

2

La raison désérialisation ne fonctionne pas est que vous avez marqué les tableaux de taux d'intérêt dans vos InterestRates_X types avec [XmlArray], par exemple:

[XmlType("InterestRates_B")] 
    public class InterestRates_B 
    { 
    [XmlArray("InterestRate_B")] 
    [XmlArrayItem("InterestRate_B", typeof(InterestRate_B))] 
    public InterestRate_B[] InterestRate_B { get; set; } 
    } 

Cela indique que les InterestRate_X collections doivent être sérialisé dans un conteneur élément, comme ceci:

<InterestRates> 
    <InterestRates_B> 
    <InterestRate_B> <!--The extra [XmlArray] container element --> 
     <InterestRate_B> 
     <ValidFrom>2016-05-01</ValidFrom> 
     <ValidTo></ValidTo> 
     <Rate>0.05</Rate> 
     <Rate2>2.05</Rate2> 
     </InterestRate_B> 
    </InterestRate_B> 

Puisque votre XML actuel n'a pas ce niveau supplémentaire d'imbrication, la désérialisation échoue .

La solution consiste à utiliser[XmlElement]:

[XmlType("InterestRates_A")] 
public class InterestRates_A 
{ 
    [XmlElement("InterestRate_A")] 
    public InterestRate_A[] InterestRate_A { get; set; } 
} 

[XmlType("InterestRates_B")] 
public class InterestRates_B 
{ 
    [XmlElement("InterestRate_B")] 
    public InterestRate_B[] InterestRate_B { get; set; } 
} 

[XmlType("InterestRates_C")] 
public class InterestRates_C 
{ 
    [XmlElement("InterestRate_C")] 
    public InterestRate_C[] InterestRate_C { get; set; } 
} 

[XmlType("InterestRates_D")] 
public class InterestRates_D 
{ 
    [XmlElement("InterestRate_D")] 
    public InterestRate_D[] InterestRate_D { get; set; } 
} 

[XmlType("InterestRates_E")] 
public class InterestRates_E 
{ 
    [XmlElement("InterestRate_E")] 
    public InterestRate_E[] InterestRate_E { get; set; } 
} 

[XmlType("InterestRates_F")] 
public class InterestRates_F 
{ 
    [XmlElement("InterestRate_F")] 
    public InterestRate_F[] InterestRate_F { get; set; } 
} 

échantillon fiddle.

Sinon, vous pouvez éliminer complètement vos InterestRates_X intermédiaires types et fusionner tous vos types InterestRate_X dans un seul type, ce qui simplifie votre modèle de données comme suit:

[XmlRoot("InterestRates")] 
public class InterestRates 
{ 
    [XmlArray("InterestRates_A")] 
    [XmlArrayItem("InterestRate_A")] 
    public InterestRate [] InterestRates_A { get; set; } 

    [XmlArray("InterestRates_B")] 
    [XmlArrayItem("InterestRate_B")] 
    public InterestRate [] InterestRates_B { get; set; } 

    [XmlArray("InterestRates_C")] 
    [XmlArrayItem("InterestRate_C")] 
    public InterestRate [] InterestRates_C { get; set; } 

    [XmlArray("InterestRates_D")] 
    [XmlArrayItem("InterestRate_D")] 
    public InterestRate [] InterestRates_D { get; set; } 

    [XmlArray("InterestRates_E")] 
    [XmlArrayItem("InterestRate_E")] 
    public InterestRate [] InterestRates_E { get; set; } 

    [XmlArray("InterestRates_F")] 
    [XmlArrayItem("InterestRate_F")] 
    public InterestRate [] InterestRates_F { get; set; } 
} 

public class InterestRate 
{ 
    [XmlElement("ValidFrom")] 
    public string ValidFrom { get; set; } 

    [XmlElement("ValidTo")] 
    public string ValidTo { get; set; } 

    [XmlElement("Rate")] 
    public string Rate { get; set; } 

    [XmlElement("Rate2")] 
    public string Rate2 { get; set; } 
} 

Sample fiddle #2.

+0

Merci. Je suis si faible dans tout cela, je ne pouvais pas comprendre pendant des heures! – no9