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 に答える