这是我对代码的想法(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);
}
答案 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);