【问题标题】:Deserializing Xml which has the same element name but different attributes反序列化具有相同元素名称但不同属性的 Xml
【发布时间】:2012-07-30 22:50:32
【问题描述】:

我有一些如下所示的 XML:

<Stat Type="first_name">[Value]</Stat>
<Stat Type="last_name">[Value]</Stat>
<Stat Type="known_name">[Value]</Stat>

我想将它反序列化为一个对象。由于有一个名为“Stat”的元素名称,因此很难获得类似的名称:

[XmlAttribute("first_name")]
public string FirstName{get;set;}

[XmlAttribute("last_name")]
public string LastName{get;set;}

[XmlAttribute("known_name")]
public string KnownName{get;set;}

有没有办法把上面的 XML 变成一个对象,比如:

public string FirstName{get;set;}
public string LastName{get;set;}
public string KnownName{get;set;}

谢谢。

【问题讨论】:

    标签: c# xml xml-serialization


    【解决方案1】:

    我设法通过使用扩展解决了这个问题。不理想。我得到了统计数据列表:

    [XmlElement("Stat")]
    public List<Stat> Stats { get; set;}
    

    然后我有单独的属性,例如:

    public string FirstName
    {
       get { return Stats.GetStat("first_name"); }
    }
    

    Stats 属性上的 GetStat 扩展方法然后获取相关键。不幸的是,这样一来,它将遍历我想要获取的每个属性的列表。

    public static string GetStat(this List<Stat> stats, string key)
    {
      var val = stats.FirstOrDefault(item => item.Type == key);
    
      if (val != null)
        return val.Value ?? String.Empty;
      return String.Empty;
    } 
    

    【讨论】:

      【解决方案2】:

      如果你想使用序列化,我认为你需要一个中间对象。所以,反序列化成这样的:

      public class Stat
      {
          [XmlAttribute("Type")]
          public string Type { get; set; }
      
          [XmlText]
          public string Value { get; set; }
      }
      

      然后编写一些代码来展平成你想要的形状。

      【讨论】:

      • 我已经在代码中有这个了。但我需要能够将其中的数据放入我的对象中。
      【解决方案3】:

      您可能必须自己使用 XPath 或其他方式解析 XML。地雷有点生锈,但类似于:

      var stat = xmlDocument.DocumentElement.GetSingleNode("stat[@type='first_name']");
      var value = stat.InnerText;
      

      【讨论】:

      • 谢谢,但我需要尝试在序列化程序中执行此操作,而不是使用 XPath。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 2015-10-08
      相关资源
      最近更新 更多