使用部件名称反序列化XmlElement

时间:2015-01-21 13:48:26

标签: c# xml xml-serialization xmlserializer xml-attribute

这是我的示例XML:

<outbound>
      <leg0 Code="aaa" RetCode="ccc"/>
      <leg1 Code="bbb" RetCode="ddd"/>
</outbound>

是否有可能以某种方式使用XmlElement(我使用XmlSerializer)将leg0和leg1反序列化为一种对象类型?

我的对象看起来像那样:

  public class FlightInfo
  {
    [XmlElement(ElementName = "outbound")]
    public Outbound Outbound { get; set; }
  }

  public class Outbound
  {
    [XmlElement(ElementName = "leg")]
    public List<Leg> Leg { get; set; }
  }

  public class Leg
  {
    [XmlAttribute(AttributeName = "Code")]
    public string Code{ get; set; }
    [XmlAttribute(AttributeName = "RetCode")]
    public string ReturnCode{ get; set; }
  }

我的问题是将leg0和leg1元素反序列化为Leg对象。任何人都可以给我一个暗示吗?

2 个答案:

答案 0 :(得分:2)

每条腿都有不同的元素名称是这里的问题。如果有可能你可以做一些像:

<outbound>
  <leg Index=0 Code="aaa" RetCode="ccc"/>
  <leg Index=1 Code="bbb" RetCode="ddd"/>
</outbound>

问题就消失了。

如果你对这种格式感到困惑,你可以做一些&#34;预处理&#34;。搜索和替换&#34; legn&#34;用&#34;腿索引= \&#34; n \&#34;&#34;这将生成上面的格式,然后您可以反序列化。

你遇到的问题是,当C#序列化一个Leg时,它需要知道要给出哪个节点名称 - 它将如何知道?你已经失去了索引。

答案 1 :(得分:0)

我认为您不能将不同的元素名称反序列化为同一属性。你可以做的是有一个单独的属性,可以加入两个列表,所以你有一个更简单的方法来访问它。如下所示(未经测试但应该有效):

公共类出站 {

[XmlElement(ElementName = "leg0")]
public List<Leg> leg0 { get; set; }

[XmlElement(ElementName = "leg1")]
public List<Leg> leg1 { get; set; }

[XmlIgnore] //You don't want to deserialize this property
public List<Leg> AllLegs { 
get
    {
        return leg0.Join(leg1);
    }
                          }

}