2016-04-20 3 views
2

Я новичок в jsoup, и мне сложно работать с не-HTML-элементами (скриптами). У меня есть следующий HTML:Сохранять не-HTML-элементы с помощью jsoup parse

<$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
  • Изменения (если это возможно) текущего языка шаблонов
    Проверить mustache, Thymyleaf, например
+0

Понял .. Спасибо, @stephan , В самом деле, не-HTML-материал там интерпретируется веб-сервисом для отображения. Я хотел убедиться, что у меня не хватает чего-то очевидного. Я обратился к Jsoup специально, потому что я не хотел писать собственный парсер, поэтому сейчас я просто оставлю свое текущее решение и буду искать изменения в размещении сценариев (программа, выплевывающая шаблон, является черным ящиком) , –