首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Linq To XML,方法来获取所有树叶的路径?

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

Stack Overflow用户
提问于 2012-01-10 05:31:50
回答 2查看 5.1K关注 0票数 5

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

代码语言:javascript
复制
<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),值来自相应叶中的值。

代码语言:javascript
复制
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中做起来似乎很简单,但我无法理解它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-10 05:42:59

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

代码语言:javascript
复制
var doc = XDocument.Load(fileName);
var leaves = 
    from e in doc.Descendants()
    where !e.Elements().Any()
    select e;

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

代码语言:javascript
复制
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;
    }
}

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

代码语言:javascript
复制
var dict = leaves.ToDictionary(e => e.Path(), e => e.Value);
票数 9
EN

Stack Overflow用户

发布于 2012-01-10 05:54:12

在将XML解析为XDocument之后(我假设您已经能够做到这一点),使用下面的方法。请注意,GetPath()实现相当简单。有关更好的实现,请参阅this answer

代码语言:javascript
复制
public Dictionary<string, string> 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<string>();
    var node = element;
    while (node != null)
    {
        nodes.Add(node.Name.ToString());
        node = node.Parent;
    }

    return string.Join("/", Enumerable.Reverse(nodes));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8795479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档