LINQ to XML получает значение из любой точки мира, используя шаблоны иерархии - PullRequest
0 голосов
/ 25 февраля 2011

Я пытаюсь разобрать плохо отформатированный XML-документ. Есть некоторые шаблоны в XML, например, для. Я хочу получить значение узла Name, у которого есть родительский MyParentNode. Затем, позже, есть еще один узел Name, который я хотел бы получить под Farm. Например,

<Node>
    <MyParentNode>
         <Name>LOL</Name>
         <RandomNode>
              <Farms>
                   <Farm>
                       <Name>MyFarmName</Name>
                   </Farm>
                   <Farm>
                       <Name>MyFarmName2</Name>
                   </Farm>
              </Farms>
         </RandomNode>
    </MyParentNode>
</Node>

Итак, я хотел бы извлечь массив, который выглядит следующим образом:

public class SomeClass{
     public string ParentName {get; set;} // MyParentNode->Name
     public string Name {get; set;} //RandomNode->Farms->Farm->Name
}

Я в основном хочу сгладить этот xml в массив:

List<SomeClass> list = FlattenXml();
list[0]; //ParentName = LOL, Name = MyFarmName
list[1]; //ParentName = LOL, Name = MyFarmName2

Проблема в том, что некоторые из этих данных находятся глубоко в иерархии, а иногда они случайны. Но их можно найти по шаблону родительского узла и дочернего узла. Может кто-нибудь показать мне код для решения вышеуказанной проблемы, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

попробуйте

public class SomeClass
        {
            public string ParentName { get; set; } // MyParentNode->Name
            public List<string> Name { get; set; } //RandomNode->Farms->Farm->Name
        }
        static List<SomeClass> FlattenXml(XElement source)
        {
            List<SomeClass> result;

            result = (from item in source.Elements()
                      select new SomeClass()
                      {
                          ParentName = item.Element("Name").ToString(),
                          Name = (from i in item.Descendants("Farm")
                                      select i.Element("Name").Value).ToList()


                      }).ToList();

            return result;
        }
0 голосов
/ 25 февраля 2011

Это работает с отправленным вами фрагментом XML.

var result = from node in doc.Descendants("MyParentNode")
             select new
             {
                 ParentName = node.Descendants("Name").First().Value,
                 FarmList = from farm in node.Descendants("Farm")
                            select farm.Element("Name").Value
             };

var flattened = result.SelectMany(a => a.FarmList,
    (a, b) => new SomeClass { ParentName = a.ParentName, Name = b });

Результат:

ParentName  Name
LOL         MyFarmName
LOL         MyFarmName2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...