[英]Jsoup node hash code collision when traversing DOM tree
我正在使用java jsoup來構建HTML DOM樹,其中使用了Node.hashCode()
。 但是我發現在遍歷DOM樹時有很多哈希碼沖突,使用以下代碼:
doc.traverse(new NodeVisitor(){
@Override
public void head(Node node, int depth) {
System.out.println("node hash: "+ node.hashCode());
/* some other operations */
}
@Override
public void tail(Node node, int depth) {
// TODO Auto-generated method stub
/* some codes */
}
}
因此,當運行它時,即使在前幾個輸出中,我也會看到許多相同的哈希碼。
哈希碼非常大,我不期望這種奇怪的行為。 我使用了jsoup-1.8.1。 任何意見都將非常感謝,謝謝。
注意:此錯誤已在jSoup 1.8.2中修復,因此我的答案不再適用。
它可能是jSoup源代碼中的一個錯誤。 從來源 :
@Override
public int hashCode() {
int result = parentNode != null ? parentNode.hashCode() : 0;
// not children, or will block stack as they go back up to parent)
result = 31 * result + (attributes != null ? attributes.hashCode() : 0);
return result;
}
我不是Java專家,但如果它們具有相同的屬性,它看起來可能會為不同的節點返回相同的值。 (和同一位家長一樣,感謝@alkis的評論)
編輯:我可以重現這個。 使用以下HTML:
<html>
<head>
</head>
<body>
<div style="blah">TODO: write content</div>
<div style="blah">Nothing here</div>
<p style="test">Empty</p>
<p style="nothing">Empty</p>
</body>
</html>
以下代碼:
String html = //HTML posted above
Document doc = Jsoup.parse(html);
Elements elements = doc.select("[style]");
for (Element e : elements) {
System.out.println(e.hashCode());
}
它給:
-148184373
-148184373
-1050420242
2013043377
在計算哈希時,它似乎完全忽略了內容文本,只有屬性很重要。
您應該實現自己的解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.