c # десериализация элемента на основе имени его родительского узла - PullRequest
0 голосов
/ 30 марта 2012

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

Вот вопрос: IХотелось бы, чтобы у класса FixtureStats было свойство 'position', которое соответствует имени элемента его родителя (поэтому объект FixtureStat, сопоставленный с home_player_1, имел бы position = 1).Можно ли это сделать с помощью встроенных атрибутов сериализации?

Если это невозможно, то какой самый чистый обходной путь?Помните, что в каждом документе будет около 50 элементов проигрывателя, каждый из которых содержит около 50 «дочерних» элементов данных.

Ответы [ 2 ]

0 голосов
/ 31 марта 2012
        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, но вы можете найти с ним стандартные строковые методы в разных случаях.

0 голосов
/ 30 марта 2012

Было бы это полезно?

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