Вы можете найти листья, ища элементы, которые не имеют потомков:
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);