2

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

谢谢。

4

3 回答 3

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;
} 
于 2012-07-30T14:50:32.770 回答
1

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

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

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

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

于 2012-07-27T12:00:35.533 回答
0

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

var stat = xmlDocument.DocumentElement.GetSingleNode("stat[@type='first_name']");
var value = stat.InnerText;
于 2012-07-27T11:55:17.333 回答