簡體   English   中英

遍歷DOM樹時Jsoup節點哈希碼沖突

[英]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

在計算哈希時,它似乎完全忽略了內容文本,只有屬性很重要。


您應該實現自己的解決方法。


這里報告 Bug。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM