【问题标题】:Deserialize XmlElement with part name使用部件名称反序列化 XmlElement
【发布时间】:2015-01-21 13:48:26
【问题描述】:

这是我的示例 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 对象。谁能给我一个提示?

【问题讨论】:

  • 您始终可以手动反序列化。读取 XML,并为每个 leg[x] 元素创建一个 Leg。
  • 我知道我可以手动反序列化,但问题是关于XmlSerializer。提供的示例只是所有 XML 的一小部分。
  • 有人问了差不多同样的问题,也没有很好的答案。也许您可以实现一个自定义 XmlAttribute,它在 ElementName 上使用正则表达式而不是常量表达式。 stackoverflow.com/questions/2874680/…

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


【解决方案1】:

让每条腿都有不同的元素名称是这里的问题。如果可能的话,您是否可以这样做:

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

问题就消失了。

如果您对格式感到困惑,您是否可以进行一些“预处理”。搜索并用 "leg Index=\"n\"" 替换 "legn",这将产生上面的格式,然后您可以反序列化。

您遇到的问题是,当 C# 序列化 Leg 时,它需要知道要给出哪个节点名称 - 它怎么知道?您丢失了索引。

【讨论】:

    【解决方案2】:

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

    公共类出站 {

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

    }

    【讨论】:

    • 感谢您的回答,但您的解决方案对我没有帮助,因为我只写了一个简单的示例。在实际情况下它甚至可以是 10000 条腿,所以写 10000 个属性没有意义。
    • leg0 和 leg1 只有单个元素,而不是列表。
    • 好吧,在这种情况下,您可以在反序列化之前修改 XML。您可以删除所有用作腿元素后缀的数字,以便它们都映射到相同的腿属性。否则,由于这并不真正适合 XML 序列化器,因此您始终可以使用 XML 处理器,例如 XMLDocument 或 XDocument。希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 2011-09-17
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多