2010-02-02 71 views
2

这是我对代码的看法(Linq查询可以直接填充字典对象吗?)。如何遍历来自Linq查询的XML元素结果集

XElement doc = XElement.Load(data.xml); 
string Element = "KeyNode"; 
string SearchString = "Dominion"; 
Dictionary<string, string> QueryData = new Dictionary<string, string>(); 

var query = from child in doc.Descendants(Element) 
      where SearchString == child.Value 
      select pn.Parent.Elements(); 


foreach(XElement x in query) 
{ 
    QueryData.Add(x.Name.ToString(),x.Value); 
} 

回答

1

我想这样做是为了创建字典:

var queryData = query.ToDictionary(x => x.Name.ToString(), x => x.Value); 

但是,如果你知道你的XML没有任何重复的名称,这只是安全的。如果它可能有重复的名称,则可能希望在查询中获得明确的列表,或者调查ToLookup()作为ToDictionary()的替代选项。

此外,您的代码将标记名称存储为字典键。如果这就是你需要的,那么很好。但是如果你真的需要标签属性的值或类似的东西,那么你需要改变你的代码。

更新

我想我看到的问题是什么。你从来没有真正说明你在迭代结果中的困难是什么,但我认为这可能是:

Elements()方法返回一个IEnumerable<XElement>。这意味着您的query变量的类型实际上是IEnumerable<IEnumerable<XElement>>。如果你想把它压扁到所有元素的单个列表,下面是如何:

var flattened = query.SelectMany(x => x); 
+0

谢谢你的字典部分,但尝试它我需要迭代初始结果。 – Zion 2010-02-02 20:13:57

+0

就是这样!叛军在那里,我相信天行者和他们在一起! 非常感谢,扁平化了诀窍。如果你能解释为什么我的结果集产生了嵌套的枚举数? – Zion 2010-02-02 20:31:41

+0

假装你的select语句是'select child.Name.ToString()'。你会得到一个'IEnumerable '。你真正的选择语句返回一系列元素(父母的所有孩子)。由于查询的最终结果是每次调用select语句时产生的一系列值,并且每个select语句都返回一系列元素,所以最终会得到一系列元素序列。 – 2010-02-02 20:41:35