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 的值,并且无法回溯。
您想使用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)
| 归档时间: |
|
| 查看次数: |
2689 次 |
| 最近记录: |