2016-11-30 2 views
0

У меня есть некоторые проблемы десериализации моего XML в класс.Deserialize XML-элементы

Это 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> 

Это код:

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; } 
    } 
} 

Когда я десериализации XML в мой корневой класс InterestRates, все InterestRate_X коллекции пусты. Как это можно зафиксировать?

+2

Так в чем же проблема? – mybirthname

+0

Что не работает должным образом? – rbr94

+1

Может быть, что Lidaranis

ответ

2

Причина десериализации не работает, что вы пометили массивы процентных ставок в ваших InterestRates_X типов с [XmlArray], например:

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

Это указывает на то, что InterestRate_X коллекции сериализовать в контейнере элемент, например, так:

<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> 

Поскольку фактическая XML не имеет такой дополнительный уровня вложенности, десериализация терпит неудачу ,

Решение является использование [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; } 
} 

Образец fiddle.

Альтернативно, можно полностью устранить ваши промежуточные InterestRates_X типы и объединить все InterestRate_X типов в один тип, тем самым упрощая модель данных следующим образом:

[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; } 
} 

fiddle #2 образца.

+0

Спасибо. Я так слаб в этом, не мог понять это часами! – no9