如何使用Jsoup递归遍历HTML树?

时间:2016-05-23 06:39:07

标签: java list recursion jsoup

我有一个html文件,我想使用第一个div标签the image display the html file structure遍历该文件 我的代码是

public static void ExtractChild(String content) {

    String data = content;
    ArrayList<String> childList = new ArrayList<String>();
    try{
    Document document = Jsoup.parse(data);
    Element div = document.select("div").first();
    Elements divChildren = div.children();
    int size = divChildren.size();
    if (size > 0) {
        for (int i = 0; i < size; i++) {
            data = divChildren.get(i).toString();

            System.out.println(data);
            ExtractChild(data);
        }
    } else {
        childList.add(data);

    }
    }
    catch(Exception e)
    {System.out.println(e.getMessage());

    }

}

} `

我得到一个Html文件作为字符串首先我捕获第一个div标签并获取所有所有孩子。在我的形象中,父母有3个孩子,第一个孩子有2个孩子。 我正在添加孩子,如果它没有任何子子(否则部分)问题发生在If部分当它找到子子时它重置i的值并且它不能回溯。

1 个答案:

答案 0 :(得分:2)

您想要使用Jsoup API中的NodeTraversor及其伴随类NodeVisitor

NodeTraversor 以递归方式遍历节点树。每次命中节点的开始标记或结束标记(如果存在)时,它都会调用给定的 NodeVisitor

示例代码

public static void main(String[] args) throws IOException {
    String html = "<div id=\"d1\">" + //
            "<div id=\"d1.0\">" + //
            "<div id=\"d1.0.0\">" + //
            "1.0.0" + //
            "</div>" + //
            "<div id=\"d1.0.1\">" + //
            "1.0.1" + //
            "</div>" + //
            "</div>" + //
            "<div id=\"d1.1\">" + //
            "1.1" + //
            "</div>" + //
            "<div id=\"d1.3\">" + //
            "1.3" + //
            "</div>" + //
            "</div>";

    List<String> childList = new ArrayList<>();
    NodeVisitor myNodeVisitor = new MyNodeVisitor(childList);
    NodeTraversor traversor = new NodeTraversor(myNodeVisitor);
    Document doc = Jsoup.parse(html);

    Element firstDiv = doc.select("div:first-of-type").first();
    if (firstDiv == null) {
        System.err.println("Unable to find any div.");
    } else {
        traversor.traverse(firstDiv);

        for (String child : childList) {
            System.out.println(child);
        }
    }
}

private static class MyNodeVisitor implements NodeVisitor {

    private List<String> childList;

    public MyNodeVisitor(List<String> childList) {
        if (childList == null) {
            throw new NullPointerException("child cannot be null.");
        }

        this.childList = childList;
    }

    @Override
    public void head(Node node, int depth) {
        if (node.childNodeSize() == 0) {
            childList.add(node.toString());
        }
    }

    @Override
    public void tail(Node node, int depth) {

    }
}

输出

1.0.0

1.0.1

1.1

1.3