我有一个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
为我提供更好的解决方案提前致谢
答案 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);
}
}