2016-05-31 78 views
0

我正在使用Jsoup 1.9.2來處理和清理特定標記的某些XML輸入。在此期間,我注意到Jsoup在要求清潔title標籤時表現得很奇怪。具體來說,title標記中的其他XML標記不會被刪除,實際上它們會被其轉義表單所替代。Jsoup乾淨標題標記失敗

我爲此創建了一個簡短的單元測試,如下所示。測試失敗,因爲output出來的值爲CuCl<sub>2</sub>

@Test 
public void stripXmlSubInTitle() { 
    final String input = "<title>CuCl<sub>2</sub></title>"; 
    final String output = Jsoup.clean(input, Whitelist.none()); 
    assertEquals("CuCl2", output); 
} 

如果title標籤被替換爲其它標籤(例如,pdiv),則一切正常。任何解釋和解決方法將不勝感激。

+0

http://stackoverflow.com/questions/8683018/jsoup-clean-without-adding-html-entities – maztt

回答

0

title標記應該在head(或在html標記的HTML5中)內使用。由於它用於顯示HTML文檔的標題,主要是在瀏覽器窗口/標籤中,因此它不應該包含子標籤。

JSoup對待它的方式與實際內容標籤pdiv不同,這同樣適用於textarea

編輯:

你可以做這樣的事情:

public static void main(String[] args) { 
    try { 
     final String input = "<content><title>CuCl<sub>2</sub></title><othertag>blabla</othertag><title>title with no subtags</title></content>"; 
     Document document = Jsoup.parse(input); 
     Elements titles = document.getElementsByTag("title"); 
     for (Element element : titles) { 
      element.text(Jsoup.clean(element.ownText(), Whitelist.none())); 
     } 
     System.out.println(document.body().toString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

,將返回:

<body> 
<content> 
    <title>CuCl2</title> 
    <othertag> 
    blabla 
    </othertag> 
    <title>title with no subtags</title> 
</content> 
</body> 

根據您的需求,需要作出一些調整,例如

System.out.println(Jsoup.clean(document.body().toString(), Whitelist.none())); 

,將返回:

CuCl2 blabla title with no subtags 
+0

謝謝!我的文檔雖然不是純HTML,但它們是帶有一些(偶然)HTML標籤的XML。你能推薦一種方法來避免這種情況(除了正則表達式替換)嗎?我喜歡/需要Jsoup的白名單。 – Claudiu