2014-06-21 19 views
0

Jsoup不正确计数孩子的数量:Jsoup不正确的值的儿童尺寸

Document document = Jsoup 
      .parse(testString); 

    Element div = document.select("div").first(); 
    Elements divChildren = div.children(); 
    System.out.println(divChildren.size()); 

例如,如果的TestString =

<div><div><p>text1</p></div><p>text2</p></div>

<div><h1><p>text1</p></h1><p>text2</p></div>

然后divChildren .size()=

如果的TestString =

<div><p><p>text1</p></p><p>text2</p></div> 

然后divChildren.size()=

我究竟做错了什么?

回答

2

如果你看看什么document解析

String testString ="<div><p><p>text1</p></p><p>text2</p></div>"; 

后抱着你会看到

<html> 
<head></head> 
<body> 
    <div> 
    <p></p> 
    <p>text1</p> 
    <p></p> 
    <p>text2</p> 
    </div> 
</body> 
</html> 

由于@Rejesh pointedp不能包含像p其他块级元素本身,所以Jsoup通过关闭这种不正确的外部元素(用于打开标签和关闭标签的单独闭合)来防止它。在你的情况

<p><p>text</p></p> 

将成为

<p></p><p>text1</p><p></p>

所以你div

<div><p><p>text1</p></p><p>text2</p></div> 

会被解析为

<div> 
    <p></p> 
    <p>text1</p> 
    <p></p> 
    <p>text2</p> 
    </div> 

和你看到有孩子(两个空的p和两个p与文本)。


如果你想关闭这个验证机制可以使用XML解析器,而不是标准的HTML解析器与

String testString ="<div><p><p>text1</p></p><p>text2</p></div>"; 

Document document = Jsoup.parse(testString,"",Parser.xmlParser()); 
System.out.println(document); 
Element div = document.select("div").first(); 
Elements divChildren = div.children(); 
System.out.println(divChildren.size()); 

现在将打印。

+0

非常感谢您的详细回复! – rdm

+0

@rdm不客气。 – Pshemo

2

this由于的:

的P元素表示一个段落。它不能包含块级元素(包括P本身)。

+0

但在现实世界中经常被发现,因为在上次的情况下只能得到直接儿童的数量等于2? – rdm