2011-02-25 28 views
0

我想解析格式不正確的xml文檔。在xml中有一些模式,例如用於例如。我想要得到具有父節點MyParentNode的節點Name的值。然後在下面,有另一個節點Name,我想根據Farm得到。例如。LINQ to XML從任何地方使用層次結構模式獲取價值

<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 

問題是這些數據中的一些在層次結構中很深,有時它們是隨機的。但是可以從父節點和子節點的模式中找到它們。有人能告訴我解決上述問題的代碼嗎?

回答

0

這適用於您發佈的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 
0

試試這個

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