2017-09-29 2 views
2

jsoup를 사용하여 HTML 페이지를 구문 분석하고 양식을 제출합니다. 양식을 제출하기 전에 "뒤로"버튼을 제거해야합니다. 나는 element.remove() 메서드를 사용하지만 그 다음에 form.formData()이 변경되지 않았 음을 알았습니다. 요청한 요소가 form.children()에서 삭제되었지만 form.elements()에 존재합니다. 이 버그 또는 폼에서 요소를 제거하는 잘못된 방법을 사용합니까?JSoup : 양식에서 요소를 제거하는 방법?

public class JsoupCheck { 
    public static void main(String[] args) { 
     String html = "<html><body><form action=\"demo\">" 
       + "<input type=\"submit\" name=\"buttonSave\" value=\"Save\">" 
       + "<input type=\"submit\" name=\"buttonBack\" value=\"Back\">" 
       + "<select name=\"selection\">" 
       + " <option value=\"value1\">Value 1</option>" 
       + " <option value=\"value2\" selected>Value 2</option>" 
       + " <option value=\"value3\">Value 3</option>" 
       + "</select>" 
       + "</form></body></html>"; 
     Document doc = Jsoup.parse(html); 
     FormElement form = (FormElement) doc.select("form").first(); 
     Element e = form.select("form").first(); 

     System.out.println("=== Original content of form"); 
     System.out.println(e); 
     System.out.println("=== Original content of form.formData()"); 
     for (Connection.KeyVal i : form.formData()) { 
      System.out.println(i.key() + "=" + i.value()); 
     } 
     System.out.println("form.elements().size() = " + form.elements().size()); 
     System.out.println("form.children().size() = " + form.children().size()); 

     e.select("input[name=buttonBack]").remove(); 
     System.out.println(); 

     System.out.println("=== Content of form after remove buttonBack (result: buttonBack removed)"); 
     System.out.println(e); 
     System.out.println("=== Content of form.formData() after remove buttonBack (result: buttonBack exist)"); 
     for (Connection.KeyVal i : form.formData()) { 
      System.out.println(i.key() + "=" + i.value()); 
     } 
     System.out.println("form.elements().size() = " + form.elements().size()); 
     System.out.println("form.children().size() = " + form.children().size()); 
    } 
} 

출력은 다음과 같습니다

=== Original content of form 
<form action="demo"> 
<input type="submit" name="buttonSave" value="Save"> 
<input type="submit" name="buttonBack" value="Back"> 
<select name="selection"> <option value="value1">Value 1</option> <option value="value2" selected>Value 2</option> <option value="value3">Value 3</option></select> 
</form> 
=== Original content of form.formData() 
buttonSave=Save 
buttonBack=Back 
selection=value2 
form.elements().size() = 3 
form.children().size() = 3 

=== Content of form after remove buttonBack (result: buttonBack removed) 
<form action="demo"> 
<input type="submit" name="buttonSave" value="Save"> 
<select name="selection"> <option value="value1">Value 1</option> <option value="value2" selected>Value 2</option> <option value="value3">Value 3</option></select> 
</form> 
=== Content of form.formData() after remove buttonBack (result: buttonBack exist) 
buttonSave=Save 
buttonBack=Back 
selection=value2 
form.elements().size() = 3 
form.children().size() = 2 

답변

2

FormElement 노드의 특별한 종류이다. 모든 자식 (Node에서 상 속됨)의 목록을 유지 관리하는 것 외에도 양식 내에있는 모든 요소의 두 번째 내부 목록을 보유합니다.

public class FormElement extends Element { 
    private final Elements elements = new Elements(); 
    ... 
} 

당신이 아이 Node#remove 전화

, 그것은 아이들의 부모의 목록이 아닌 내부 목록을 업데이트합니다.

따라서, 정말 요소를 제거하기 위해, 당신은 또한이 내부 목록에서 제거해야합니다

e.select("input[name=buttonBack]").remove(); 
form.elements().removeIf(e -> e.attr("name").equals("buttonBack")); 
관련 문제