使用Linq To XML,获取所有叶子路径的方法?

好的,我有以下XML树

   1000 2000 3000   4000 5000     6000    

从接收XDocument的方法我想生成一个字典,其中键是路径(实际上是XPath),值来自相应叶子中的值。

 root/A/A1/A1A 1000 root/A/A1/A1B 2000 root/A/A1/A1C 3000 root/A/A2/A2A 4000 root/A/A2/A2B 5000 root/B/B1/B1A 6000 

在Linq to XML中似乎很简单,但我无法理解它。

您可以通过查找没有后代的元素来查找叶子:

 var doc = XDocument.Load(fileName); var leaves = from e in doc.Descendants() where !e.Elements().Any() select e; 

我不知道是否有内置的方法来获取元素的路径,但您可以轻松地创建一个扩展方法来构建它:

 static class Extensions { public static string Path(this XElement element) { XElement tmp = element; string path = string.Empty; while (tmp != null) { path = "/" + tmp.Name + path; tmp = tmp.Parent; } return path; } } 

然后,您可以像这样构建字典:

 var dict = leaves.ToDictionary(e => e.Path(), e => e.Value); 

在将XML解析为XDocument之后,我假设您已经能够执行此操作,请使用以下方法。 请注意, GetPath()实现非常简单。 请参阅此答案以获得更好的实施。

 public Dictionary GetLeaves(XDocument doc) { var dict = doc .Descendants() .Where(e => !e.HasElements) .ToDictionary(e => GetPath(e), e.Value); return dict; } private string GetPath(XElement element) { var nodes = new List(); var node = element; while (node != null) { nodes.Add(node.Name.ToString()); node = node.Parent; } return string.Join("/", Enumerable.Reverse(nodes)); }