获取DOM树中所有根到叶路径的列表 [英] Get a list of all root-to-leaf paths in a DOM tree

查看:150
本文介绍了获取DOM树中所有根到叶路径的列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

到目前为止,我了解到,当我将XML解析为DOM对象时,它被表示为一个树。我正在尝试通过TreeWalker获取从root到任何叶子的所有路径的列表,但是我想知道我是否应该执行自己的实现或者现在有任何定义的实现。在官方文档中没有发现。

So far I understood that when I parse an XML as a DOM object it is represented as a tree. I'm trying to get a list of all the paths from root to any leaf of my XML document (n-ary tree) with the TreeWalker, however I'm wondering if I should do my own implementation or there's any existing implementation defined. I found none in the official documentation.

给定xml文档:

<node id="A">
   <node id = "AA">
       <node id = "AAA"></node>
   </node>
   <node id = "AB">
   </node>
   <node id = "AC">
   </node>
</node>

预期列表应包含:

A, AA, AAA 
A, AB
A, AC


推荐答案

非递归 TreeWalker

Non-recursive TreeWalker

这很简单。查找所有的叶子元素,然后通过行走父链显示路径。

It's fairly simple. Find all leaf elements, then display path by walking the parent chain.

NodeFilter leafElements = new NodeFilter() {
    @Override
    public short acceptNode(Node node) {
        for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling())
            if (child.getNodeType() == Node.ELEMENT_NODE)
                return NodeFilter.FILTER_SKIP;
        return NodeFilter.FILTER_ACCEPT;
    }
};
TreeWalker walker = ((DocumentTraversal)document).createTreeWalker(document.getDocumentElement(),
                                                                   NodeFilter.SHOW_ELEMENT,
                                                                   leafElements,
                                                                   false);
for (Element leaf; (leaf = (Element)walker.nextNode()) != null; ) {
    Deque<String> path = new ArrayDeque<>();
    for (Node node = leaf; node.getNodeType() == Node.ELEMENT_NODE; node = node.getParentNode())
        path.addFirst(((Element)node).getAttribute("id"));
    System.out.println(path);
}

输出

[A, AA, AAA]
[A, AB]
[A, AC]






简单递归

也很简单。回复后代,维护路径到目前为止,并为叶元素打印。

Also fairly simple. Recurse descendants, maintaining path so far, and print for leaf elements.

showLeafPaths(document.getDocumentElement(), new StringBuilder());



private static void showLeafPaths(Element elem, StringBuilder path) {
    final int pathLen = path.length();
    if (pathLen != 0)
        path.append(", ");
    path.append(elem.getAttribute("id"));
    boolean hasChild = false;
    for (Node child = elem.getFirstChild(); child != null; child = child.getNextSibling())
        if (child.getNodeType() == Node.ELEMENT_NODE) {
            hasChild = true;
            showLeafPaths((Element)child, path);
        }
    if (! hasChild)
        System.out.println(path);
    path.setLength(pathLen);
}

输出

A, AA, AAA
A, AB
A, AC

这篇关于获取DOM树中所有根到叶路径的列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆