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