あなたはなぜこれがうまくいかないのか尋ねました
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());
}
}
これが混乱を解消するのに役立つことを願っています。