2012-06-16 1 views
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"); 
+0

Помог ли один из нижеприведенных ответов? Если да, то пожалуйста, примите одно, так что эту тему можно считать закрытой. Если нет, сообщите об этом сообществу, чтобы мы могли оказать дополнительную помощь. – alkis

ответ

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); 
     } 
    } 
} 
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 класс.

Проверить эти примеры

Пример 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()); 
    } 
} 

Я надеюсь, что это поможет очистить confu Sion.