Jsoup在遍历时删除节点和子节点

时间:2016-04-14 14:41:13

标签: java jsoup

我试图用Jsoup遍历DOM的节点,并在满足条件时删除一些节点及其子节点。但是,我这样做了java.lang.NullPointerException例外。我有类似的东西:

File input = new File(inputPath);
Document doc = Jsoup.parse(input, "UTF-8");

doc.traverse(new NodeVisitor() {

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

      switch (node.getClass().getName()){

        case "org.jsoup.nodes.Element":

            Element elem = (Element) node;
            Map<String, String> dataset = elem.dataset();
            for (String key : dataset.keySet()) {

                .....

                // Here is the problem
                if (someCondition) node.remove()
            }
            break;

       case "org.jsoup.nodes.TextNode":

           ....
           break;
       }
    }

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

    }
});

不知怎的,它在迭代它们时不会让我删除节点是有道理的,但是实现这个目的的方法是什么呢?在遍历DOM时删除节点及其子节点?

2 个答案:

答案 0 :(得分:2)

删除headtail中的节点将无法可靠地工作(实际上它似乎取决于您删除的节点)。您可以简单地存储对要删除的节点的引用,然后在之后处理它们,而不是在遍历时删除。

List<Node> toRemove = new LinkedList<>();
doc.traverse(new NodeVisitor() {
    @Override
    public void head(Node node, int depth) {
        // ...
        if(condition)
            toRemove.add(node);
    }
    // ...
});

for (Node node : toRemove)
    node.remove();

即使您删除了所有非root 节点,上面的示例也应该有效。

答案 1 :(得分:0)

猜测:尝试在遍历方法结束时删除节点。或者,每次移除时都重新启动遍历。