2016-11-30 152 views
0

我有一些将我的XML反序列化为类的问题。反序列化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

可能是<! - 类型A,B,C ...评论标签没有关闭? – 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