2013-02-09 59 views
0
我使用Jsoup解析包含需要一些邏輯運算的結果

Jsoup解析器問題

一些像這樣的自定義標籤簡短的HTML文檔

<table><showif field="xxx"><tr><td>test</test></td></tr></showif><tr><td>xyz</td></tr></table> 

Document doc = Jsoup.parse(html); 
Elements showif_fields = doc.select("SHOWIF[field]"); 

在這種情況下,內部的內容似乎丟失,outerHtml()方法僅顯示了這一點:

<showif value="xxx"></showif> 

但如果「showif」標籤包含一個簡單的文本一樣招呼,它按預期工作。

任何想法? 謝謝。

回答

1

您碰到的問題是表格內容的HTML規範非常嚴格,所以您的未知標籤會在表格外進行培育。 (Jsoup這樣做是爲了匹配HTML規範,以便它儘可能與瀏覽器行爲相匹配。)

在這種情況下,您知道自己在做什麼並且正在創建HTML,因此您可以設置jsoup忽略HTML規範,只是在它看到它們時處理標籤。與XML parser做到這一點:

Document doc = Jsoup.parse(html, baseUri, Parser.xmlParser()); 
+0

謝謝喬納森,它的工作原理! – 2013-02-22 22:55:07

0

問題是,Jsoup已經「消毒」了你的HTML。作爲一個快速測試,我貼你的HTML到一個頁面,用我的瀏覽器(這往往不是消毒吧)查看它,它告訴我的HTML實際上看起來像:

<showif value="xxx"/> 
<table><tbody><tr><td>test</td></tr><tr><td>xyz</td></tr></tbody></table> 

這是因爲只有少數幾個元素允許直接在<table>之內,並且瀏覽器認爲你在​​內部放置了一個<showif>標籤,並且爲你解決了這個問題。我認爲Jsoup做了類似的事情。

編輯:有Jsoup現在正在運行,而事實上它創建了一個類似的輸出,如果我看doc.outerHtml()

如果你真的需要使用非標準的東西來詮釋您的網頁,你可能有更好的運氣非標準的屬性,如:

<table> 
    <tr showif="xxx"><td>test</test></td></tr> 
    <tr><td>xyz</td></tr> 
</table> 

那麼你可以說:Elements showif_fields = doc.select("*[showif]");。這產生了

<tr showif="xxx"> 
    <td>test</td> 
</tr> 

作爲showif_fields.outerHtml()

然後,您可能會採用不同的方法,例如, JavaScript模板引擎,如jQuery模板或Mustache(以及許多其他模板引擎),它們在執行一些邏輯之後插入生成的HTML,而不是將內容加載到頁面上並在之後進行修復。這當然取決於你的要求,我不知道這個建議是否合理。 編輯:不,它沒有任何意義,因爲Jsoup是服務器端,請參閱下面的註釋。

+0

謝謝克萊門斯的回答,但在這一點上沒有瀏覽器可言,我們的目標是呈現在瀏覽器中的「消毒」的HTML。這個值直接在Jsoup解析器中傳遞,並且解析器「自我清理」它,重建「錯誤」的樹,我想這與它處理未知標記有關。記錄中我需要它在一個Android應用程序。 – 2013-02-10 07:51:01

+0

啊,愚蠢的我,我沒有檢查,並假設J來自JavaScript,而不是Java。由於事情是服務器端,那麼我的「不同的方法」段完全沒有意義。但是我看到Jsoup試圖淨化html本身,所以也許會出現這個問題。我已經相應地更新了我的答案。 – 2013-02-10 07:58:33