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

标签 c# xml xpath tree linq-to-xml

好的,我得到了下面的 XML 树

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

我想从一个接收 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);

关于c# - 使用 Linq To XML,获取所有叶子路径的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8795479/

相关文章:

xml - 使用 XPATH 和 XSLT 根据属性值的某些相等条件在 XML 中提取相关的不同元素标签

xml - XPath Script 不适用于输入一,但对输入二工作得很好

c# - DateTime.Parse 今天(2012 年 3 月 1 日)失败! o_0

c# - 从字符串加载图像

android - 为什么 AppBar 会在我的应用栏背景中添加方 block

带有标签特定信息的 Python XML 解析

c# - 检查输入是否为数字且仅包含数字 0-9

c# - 方法调用上的问号语法

c# - 从接口(interface)派生的通用对象的 XML 序列化列表,,,

xml - 选择 xslt 模板中更高级别元素的值