c#根据元素的父节点名称反序列化元素

时间:2012-03-30 17:08:32

标签: c# xml-serialization xml-parsing linq-to-xml

我正在使用的XML具有以下结构:

 <fixture_statistics>
  <home_player_1 id="2306143" teamid="2">
   <element_1>Some Data</element_1>
   <element_2>Some Data</element_2>
  </home_player_1>
  <home_player_2 id="2306144" teamid="2">
   <element_1>Some Data</element_1>
   <element_2>Some Data</element_2>
  </home_player_2>
 </fixture_statistics>

现在反序列化的代码通常如下所示:

[XmlRootAttribute("fixture_statistics", Namespace = "", IsNullable = false)]
    public class FixtureRoot
    {
        [XmlElement("home_player_1")]
        [XmlElement("home_player_2")]
        public List<FixtureStats> fixtures { get; set; }
    }
    public class FixtureStats
    {
        public string element_1;
        [XMLElement("element_2")]
        public string elementTwo;
    }

这是一个问题:我希望FixtureStats类具有一个'position'属性,该属性与它的父元素名称相对应(因此与home_player_1相对应的FixtureStat对象将具有position = 1)。 这可以通过内置的序列化atrributes完成吗?

如果不可能,那么最干净的解决方法是什么?请记住,每个文档将包含大约50个玩家元素,每个元素包含大约50个“子”数据元素。

2 个答案:

答案 0 :(得分:0)

这会有用吗?

XDocument xDoc = XDocument.Load(.....);
var result = 
   xDoc.Descendants("element_1")
   .Select(n => new { Parent = n.Parent.Attribute("id").Value,Value = n.Value, })
   .ToArray();

答案 1 :(得分:0)

        var xml = XElement.Load("XMLFile1.xml");

        int startIndex = 12;
        List<FixtureStats> fixtures =
            (from playerNode in xml.Elements()
             select new FixtureStats
             {
                 position = Int32.Parse(playerNode.Name.LocalName.Substring(startIndex)),
                 element_1 = playerNode.Element("element_1").Value,
                 element_2 = playerNode.Element("element_2").Value
             }).ToList();

您必须在父元素名称中找到整数部分所在的位置。在“home_player_1”的情况下它是12,但你可以在不同的情况下找到它的标准字符串方法。