Сохранение не-HTML элементов с помощью 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$>

Приложение, используемое для отображения этого, знает, что делать с этими операторами и т. Д. Поэтому, когда я просто анализирую текст с помощью 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. Создайте объект Document с чистым 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();

Большое спасибо за любую помощь или вклад!

1 ответ

Решение

Проблема в том, что я не знаю, как сохранить не-HTML элементы и сохранить форматирование в том же месте, что и оригинал.

Jsoup - это анализатор HTML. Предоставляемый вами "HTML-файл" не содержит HTML. Это скорее файл шаблона, написанный на языке, похожем на HTML.

В результате Jsoup в лучшем случае будет рассматривать этот файл шаблона как недопустимый файл HTML. Вот почему все не-HTML элементы экранируются.

Чтобы получить то, что вам нужно, вы должны написать свой собственный анализатор шаблонов. Jsoup предоставляет некоторые общие классы, которые облегчили бы эту задачу.

Однако по замыслу эти общие классы зарезервированы только для внутреннего использования.

Это оставило нам четыре варианта:

  • Ваше актуальное решение
    Накормите Jsoup чистым HTML
  • Отправить вопрос команде Jsoup
    Спросите о возможности создавать собственные парсеры
  • Написать более надежный пользовательский парсер
    Это решение изобретать колесо ИМО
  • Измените (если возможно) ваш текущий язык шаблона
    Проверьте усы, Thymyleaf например
Другие вопросы по тегам