2016-04-20 42 views
2

我是jsoup的新手,我在使用非HTML元素(腳本)時遇到了一些困難。我有以下HTML:用jsoup解析保留非HTML元素

<$if not dcSnippet$> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="generator" content="Outside In HTML Converter version 8.4.0"/> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<title></title> 
</head> 

<$endif$> 
<div style="position:relative"> 
<p style="text-align: left; font-family: times; font-size: 10pt; font-weight: normal; font-style: normal; text-decoration: none"><span style="font-weight: normal; font-style: normal">This is a test document.</span></p> 
</div> 
<$if not dcSnippet$> 
</body> 
</html> 
<$endif$> 

用來顯示該知道如何處理那些<如果dcSnippet $ >等語句做的應用。所以,當我簡單地用jsoup解析文本時,<和>被編碼並且html被重新組織,所以它不能正確執行或顯示。像這樣:

<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>&lt;$if not dcSnippet$&gt; 
<meta http-equiv="generator" content="Outside In HTML Converter version 8.4.0"> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title></title> 
&lt;$endif$&gt; 
<div style="position:relative"> 
<p style="text-align: left; font-family: times; font-size: 10pt; font-weight: normal; font-style: normal; text-decoration: none"><span style="font-weight: normal; font-style: normal">This is a test document.</span></p> 
</div> 
&lt;$if not dcSnippet$&gt; 
&lt;$endif$&gt; 
</body></html> 

我的最終目標是我想添加一些CSS和JS包括,並修改一些元素屬性。這不是一個真正的問題,我有這麼多的工作。問題是我不知道如何保留非HTML元素並將格式保留在與原始位置相同的位置。我的解決方案到目前爲止是這樣的:

  1. 閱讀HTML文件,並遍歷它,刪除非HTML元素的行。
  2. 與純HTML創建文檔對象
  3. 讓我修改
  4. 回到通過HTML,然後重新插入我刪除第一非HTML元素(腳本)。
  5. 保存文檔輸出到文件系統

這適用於現在,只要非HTML的位置是可以預測的,而且至今它。但是我想知道是否有更好的方法可以做到這一點,所以我不必首先「清理」HTML,然後手動重新介紹之後刪除的內容。這裏是我的代碼的要點(希望我沒有錯過太多的聲明):

String newLine(); 
FileReader fr = new FileReader(inputFile); 
BufferedReader br = new BufferedReader(fr); 
while ((thisLine = br.readLine()) != null) { 
    if (thisLine.matches(".*<\\$if.*\\$>")) { 
     ifStatement = thisLine + "\n"; 
    } else if (thisLine.matches(".*<\\$endif\\$>")) { 
     endifStatement = thisLine + "\n"; 
    } else { 
     tempHtml += thisLine + "\n"; 
    } 
} 
br.close(); 

Document doc = Jsoup.parse(tempHtml, "UTF-8"); 
doc.outputSettings().prettyPrint(false).escapeMode(EscapeMode.extended); 

Element head = doc.head(); 
Element body = doc.body(); 
Element firstDiv = body.select("div").first(); 

[... perform my element and attribute inserts ...] 

body.prependText("\n" + endifStatement); 
body.appendText("\n" + ifStatement); 
String fullHtml = (ifStatement + doc.toString().replaceAll("\\&lt;", "<").replaceAll("\\&gt;", ">") + "\n" + endifStatement); 

BufferedWriter htmlWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "UTF-8")); 
htmlWriter.write(fullHtml); 
htmlWriter.flush(); 
htmlWriter.close(); 

非常感謝任何幫助或輸入!

回答

0

問題是我不知道如何保留非HTML元素並將格式保留在與原始位置相同的位置。

Jsoup是一個HTML解析器。您提供的「HTML文件」不包含HTML。它更像是一個用類似HTML的語言編寫的模板文件。

因此,Jsoup會認爲這個模板文件最好是無效的HTML文件。這就是爲什麼所有非HTML元素都會被轉義的原因。

爲了達到您的需要,您必須編寫自定義模板解析器。 Jsoup確實提供了一些可以使這項任務變得非常簡單的通用類。

但是,通過設計,這些泛型類僅保留供內部使用。

這給我們留下了四個選項:

  • 您的實際解決方案
    飼料Jsoup純HTML
  • 發送issue到Jsoup隊
    詢問創建自定義的能力解析器
  • 再寫一個r obust自定義分析器
    這是一個重塑輪解決方案IMO
  • 變化(如果可行的話) 當前模板語言
    檢查mustacheThymyleaf例如
+0

明白了..謝謝,@stephan 。事實上,那裏的非HTML內容被web服務解釋爲顯示。我想確保我沒有失去明顯的東西。我專門轉向Jsoup是因爲我不想編寫自定義解析器,因此我現在只保留當前的解決方案,並查看腳本放置中的更改(程序吐出的模板是黑盒子) 。 –