2010-06-29 80 views
0

我有一个XML文件(sample.xml中),其具有以下结构xml文档读取使用XML LINQ在C#

<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的”

现在,我使用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(); 

但它返回“名称”的文件中所有的“孩子”元素的属性值。

请给我一个更好的解决方案做到这一点使用XML来LINQ

在此先感谢

回答

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()。这将为你带来所有的名字属性。目前还不清楚你为什么将你的原始示例代码分组,但希望这会让你顺利。

+0

@ Jon Skeet:谢谢...... – 2010-06-29 08:26:11

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); 
    } 
} 
+0

@ David:谢谢............. – 2010-06-29 08:26:31