反序列化具有相同元素名称但属性不同的Xml

时间:2012-07-27 11:21:00

标签: c# xml xml-serialization

我有一些看起来像这样的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;}

感谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

    [XmlText]
    public string Value { get; set; }
}

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

答案 2 :(得分:0)

你可能必须自己用XPath或其他东西来解析XML。地雷有点生疏,但有点像:

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