簡體   English   中英

使用jsoup解析保留非HTML元素

[英]Preserve non-HTML elements with jsoup parse

我是jsoup的新手,使用非HTML元素(腳本)時遇到一些困難。 我有以下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$>

用於顯示此內容的應用程序知道如何處理這些<if 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創建一個Document對象
  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();

非常感謝您的幫助或輸入!

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

Jsoup是HTML解析器。 您提供的“ HTML文件”不包含HTML。 它更多是用類似HTML的語言編寫的模板文件。

因此,Jsoup最多會將此模板文件視為無效的HTML文件。 這就是為什么所有非HTML元素都被轉義的原因。

為了實現所需的功能,您必須編寫自定義模板解析器。 Jsoup確實提供了一些通用類,這些類使此任務非常容易。

但是,根據設計,這些通用類僅保留供內部使用。

這給了我們四個選擇:

  • 您的實際解決方案
    用純HTML提要Jsoup
  • 向Jsoup團隊發送問題
    要求具有創建自定義解析器的能力
  • 編寫更強大的自定義解析器
    這是IMO的創新車輪解決方案
  • 更改(如果可行)您當前的模板語言
    檢查胡子 ,例如胸腺

暫無
暫無

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

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