4

鉴于以下代码:

HTML:

<div>a</div>
<div>b</div>
<div>c</div>

JS:

Document doc = Jsoup.parse(baseHtml);
Elements elements = doc.select("div");
elements.get(1).remove();
// remove doesn't affect elements. why?
elements.size();   // equal 3
// but this works
doc.outerHtml() // <div>a</div><div>c</div>

我必须使用此代码来获取删除的元素吗?好像太啰嗦了。

Document doc = Jsoup.parse(baseHtml);
Elements elements = doc.select("div");
elements.get(1).remove();
elements = doc.select("div");
4

2 回答 2

5

这应该可以帮助您:

public class TestJsoup {

    public static void main(String[] args) {
        try {
            Document doc = Jsoup.connect("http://www.google.ro").get();
            Elements select = doc.select("div");
            System.out.println(select.size());
            select.remove(1);
            System.out.println(select.size());
        } catch (IOException ex) {
            Logger.getLogger(TestJsoup.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
于 2012-06-22T05:07:17.463 回答
1

你问为什么这不起作用

elements.get(1).remove();
// remove doesn't affect elements. why?

答案可以在实现中找到。您在元素上调用的方法是在Node类中实现的方法。

public void remove() {
    Validate.notNull(this.parentNode);
    this.parentNode.removeChild(this);
}

如您所见,调用remove()从父级中删除了此元素(如果您打印文档,您将看到该元素b已被删除。但这并不意味着该元素已从该类所Elements包含的元素列表中删除。

public class Elements implements List<Element>, Cloneable {
    private List<Element> contents; 

为了做到这一点,您必须按照@Silviu Burcea 向您展示的方式进行操作,通过调用remove(int index)您正在调用以下方法的方法,该方法可以在Elements类中实现

public Element remove(int index) {
    return ((Element) this.contents.remove(index));
}

尽管牢记在心,但如果您这样做,您唯一要做的就是从Elements该类包含的列表中删除第 i 个元素。

检查这些示例

示例 1:元素的大小减小,但文档保持不变

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class Main {

    public static void main(String[] args) throws Exception {
        String baseHtml =   "<div>a</div>" +
                            "<div>b</div>" +
                            "<div>c</div>";

        Document doc = Jsoup.parse(baseHtml);
        Elements elements = doc.select("div");
        elements.remove(1);
        System.out.println(doc.outerHtml());
        System.out.println("-----------------------------------");
        System.out.println(elements.size());   
        System.out.println("-----------------------------------");
        System.out.println(doc.outerHtml()); 
    }
}

示例 2:元素保持不变,但文档发生了变化

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class Main {

    public static void main(String[] args) throws Exception {
        String baseHtml =   "<div>a</div>" +
                            "<div>b</div>" +
                            "<div>c</div>";

        Document doc = Jsoup.parse(baseHtml);
        Elements elements = doc.select("div");
        elements.get(1).remove();
        System.out.println(doc.outerHtml());
        System.out.println("-----------------------------------");
        System.out.println(elements.size());   
        System.out.println("-----------------------------------");
        System.out.println(doc.outerHtml()); 
    }
}

我希望这有助于消除混乱。

于 2014-11-26T21:17:07.400 回答