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

vin*_*hik 4 java recursion list jsoup

我有一个 html 文件,我想使用第一个 div 标签遍历该文件图像显示 我的代码的 html 文件结构

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());
        
    }

}
}
Run Code Online (Sandbox Code Playgroud)

我得到一个 Html 文件作为 String First 我抓住第一个 div 标签并获得它所有的孩子。在我的形象中,父母有 3 个孩子,第一个孩子有 2 个孩子。我正在添加孩子,如果它没有任何子孩子(else 部分),问题发生在 If 部分,当它找到子孩子时,它会重置 i 的值,并且无法回溯。

Ste*_*han 5

您想使用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("childList 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) {

    }
}
Run Code Online (Sandbox Code Playgroud)

输出

1.0.0

1.0.1

1.1

1.3
Run Code Online (Sandbox Code Playgroud)