如何从Linq查询中迭代XML元素结果集

时间:2010-02-02 20:02:52

标签: xml linq

这是我对代码的想法(Linq查询可以直接填充字典对象吗?)。

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 个答案:

答案 0 :(得分: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);