C# 用部件名反序列化XmlElement

C# 用部件名反序列化XmlElement,c#,xml,xml-serialization,xmlserializer,xml-attribute,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 { [XmlElem

这是我的示例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; }
  }
公共类FlightInfo
{
[XmlElement(ElementName=“outbound”)]
公共出站{get;set;}
}
公务舱外游
{
[xmlement(ElementName=“leg”)]
公共列表分支{get;set;}
}
公务舱航段
{
[XmlAttribute(AttributeName=“Code”)]
公共字符串代码{get;set;}
[XmlAttribute(AttributeName=“RetCode”)]
公共字符串返回码{get;set;}
}

我的问题是将元素leg0和leg1反序列化为Leg对象。有人能给我一个提示吗?

我认为不能将不同的元素名称反序列化到同一个属性。您可以做的是使用一个单独的属性将两个列表连接起来,这样您就可以更轻松地访问它。如下所示(未经测试,但应能正常工作):

公务舱外游 {

[xmlement(ElementName=“leg0”)]
公共列表leg0{get;set;}
[xmlement(ElementName=“leg1”)]
公共列表leg1{get;set;}
[XmlIgnore]//您不想反序列化此属性
公共列表所有腿{
得到
{
返回leg0.Join(leg1);
}
}

}

这里的问题是每个分支都有不同的元素名称。如果可能的话,您是否可以采取以下措施:

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

这个问题就消失了

如果你对格式有困难,你能做一些“预处理”吗。搜索“legn”并将其替换为“leg Index=\“n\”,这将生成上面的格式,然后可以反序列化


现在的问题是,当C#序列化
分支时,它需要知道要给出哪个节点名-它如何知道?您丢失了索引。

您始终可以手动反序列化。阅读XML,为每个leg[x]元素创建一个leg。我知道我可以手动反序列化,但问题是关于XmlSerializer的。给出的示例只是所有XML的一小部分。有人问了同样的问题,但也没有很好的答案。也许您可以实现一个自定义XmlAttribute,它在ElementName上使用正则表达式而不是常量表达式。谢谢你们的回答,但你们的解决方案对我并没有帮助,因为我只写了一个简单的例子。在实际情况下,它甚至可能有10000个分支,因此编写10000个属性没有意义。leg0和leg1只有单个元素,而不是列表。在这种情况下,您可以在反序列化之前修改XML。您可以删除所有用作leg元素后缀的数字,以便它们都映射到同一leg属性。或者,因为这不适合XML序列化程序,所以您可以始终使用XML处理器,如XMLDocument或XDocument。希望这有帮助。
<outbound>
  <leg Index=0 Code="aaa" RetCode="ccc"/>
  <leg Index=1 Code="bbb" RetCode="ddd"/>
</outbound>