2010-06-29 94 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