在C#中使用XML到LINQ读取Xml文件

时间:2010-06-29 07:54:18

标签: c# xml

我有一个xml文件(Sample.xml),它具有以下结构

<RootElement> 
 <Children> 
    <Child Name="FirstChild" Start="0" End="2"> 
      <Sibling Name="Test1" /> 
      <Sibling Name="Test2" /> 
      <AdditionalSibling Name="Add_Test_1" /> 
      <AdditionalSibling Name="Add_Test_2" /> 
      <MissingSibling Name="Miss_Test_1" /> 
      <MissingSibling Name="Miss_Test_2" / 
 </Child> 

 <Child Name="SecondChild" Start="0" End="2"> 
      <Sibling Name="Test3" /> 
      <Sibling Name="Test4" /> 
 </Child> 
 <Child Name="ThirdChild" Start="0" End="2"> 
      <Sibling Name="Test5" /> 
      <Sibling Name="Test6" /> 
  </Child> 
  <Child Name="FourthChild" Start="0" End="2"> 
      <Sibling Name="Test7" /> 
      <Sibling Name="Test8" /> 
  </Child> 
  <Child Name="FifthChild" Start="0" End="2"> 
      <Sibling Name="Test9" /> 
      <Sibling Name="Test10" /> 
  </Child> 
  <Child Name="SixthChild" Start="0" End="2"> 
      <Sibling Name="Test11" /> 
      <Sibling Name="Test12" /> 
  </Child> 

  <MatchedChilds> 
     <Child Name="FirstChild" /> 
     <Child Name="SecondChild" /> 
     <Child Name="ThirdChild" /> 
     <Child Name="FourthChild" /> 
     <Child Name="FifthChild" /> 
     <Child Name="SixthChild" />  
  </MatchedChilds> 
 </Children> 
</RootElement> 

我需要读取直接位于“RootElement”

下的元素“Child”的属性值

现在我正在使用像

这样的LINQ查询
          List<string> lst = (from element in XDocument.Load(Application.StartupPath + "\\Sample.xml")
                                                       .Descendants("Child")
                                                        group element by element.Attribute("Name").Value into KeyGroup select KeyGroup.Key )
                                                       .ToList();

但它返回文件中所有“Child”元素的“Name”的属性值。

请使用XML to LINQ

为我提供更好的解决方案

提前致谢

2 个答案:

答案 0 :(得分:3)

使用类似的东西:

XDocument doc = XDocument.Load(Application.StartupPath + "\\Sample.xml");
List<string> lst = doc.Root.Elements("Child")
                      .Select(x => (string) x.Attribute("Name"))
                      .ToList();

请注意使用Elements()代替Descendants()。这将获得所有的名称属性。我不清楚你为什么要在原始示例代码中进行分组,但希望这会让你前进。

答案 1 :(得分:0)

分组,因此您的列表将包含名称元素。您可以按如下方式查询和迭代结果:

var query = from element in XDocument.Load(Application.StartupPath + "\\Sample.xml")
    .Descendants("Child")
    group element by element.Attribute("Name").Value into KeyGroup 
    select new { Grouping = KeyGroup.Key, Children = KeyGroup };

和迭代

foreach(var namekey in query)
{
    Console.WriteLine(namekey.Grouping);
    foreach(var child in namekey.Children)
    {
        Console.WriteLine(child.whatever);
    }
}