2010-11-19 75 views
2
<Results> 
    <ResultSet>"nothing special" Description="More of nothing" 
    <Results> 
     <Result> 
     <Body>Four in this group</Body> 
     <Body2>this is more stuff I want</Body2> 
     <Body3>This is interesting stuff I want</Body3> 
     <Body4>this is more stuff I want</Body4> 
     </Result> 
     <Result> 
     <Something1>Only 3 in the group</Something1> 
     <ID>this is more stuff I want</ID> 
     <Stuff>This is interesting stuff I want</Stuff> 
     </Result> 
     <Result> 
     <Tag1>Only 3 in the group</Tag1> 
     <Tag2>this is more stuff I want</Tag2> 
     <Tag3>This is interesting stuff I want</Tag3> 
     </Result> 
    </Results> 
    </ResultSet> 
</Results> 

我该如何使用Linq到XML来取出所有的<Result>块?正如你可以看到每个块可以有任何数量的元素,我不知道他们被称为什么。我的最终目标是将这些块封装到对象中,然后再传递给我的应用程序。LINQ To XML - 如何查询内部元素中的所有元素?

我遇到的问题是我不能让每个组使用Linq分开打破。我能得到的最接近的结果是将所有<Result>组中的所有元素都归为一个大列表(使用后代)。

编辑:这是我用来恢复每个<Result>组中的所有内容的代码。我无法弄清楚如何迭代这个查询中的列表来分解名称/值对。我不知道元素的名称,所以我不能通过名称来引用它们。最后,我只想每个<Result>中的每个元素的名称/值对。

var query = from item in xml.Descendants("Result") 
       select item; 

任何帮助?

谢谢,斯科特

+0

'Descendants'不应返回 “内部” 的事情'结果'元素。它应该返回一系列Result元素,这显然是你需要的。 “Descendants”不适用什么? – 2010-11-19 05:11:36

+0

我刚更新了帖子以显示我正在使用的代码以及我正在尝试执行的操作。 – Scott 2010-11-19 05:44:52

回答

1

后人将抓住给定名称的所有后代节点。如果您想具体说明,则需要逐个元素遍历XML层次结构元素,例如xml.Element("ResultSet").Element("Results").Elements("Result")

这应该指向你在正确的方向:

var query = xml.Descendants("Result") 
       .Select(r => r.Elements() 
          .Select(e => new { Name = e.Name.LocalName, Value = e.Value })); 
foreach (var result in query) 
{ 
    foreach (var item in result) 
    { 
     Console.WriteLine("{0} : {1}", item.Name, item.Value); 
    } 
} 

或者,你可以使用SelectMany和扁平化的结果集:

var query = xml.Descendants("Result") 
       .SelectMany(r => r.Elements() 
           .Select(e => new { Name = e.Name.LocalName, Value = e.Value })); 
foreach (var item in query) 
{ 
    Console.WriteLine("{0} : {1}", item.Name, item.Value); 
} 
+0

你的第一个例子正是我正在寻找的。这保持名称/值分组。第二个例子是我一直得到的。由于我不知道一个组的起始位置和另一个组的结束位置,因此它太平坦而无用。太棒了。谢谢! – Scott 2010-11-19 06:23:52