Сохранение не-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$>
Приложение, используемое для отображения этого, знает, что делать с этими операторами
<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><$if not dcSnippet$>
<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>
<$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$>
<$endif$>
</body></html>
Моя конечная цель здесь - я хочу добавить несколько включений css и js и изменить пару атрибутов элемента. Это не проблема, у меня так много получилось. Проблема в том, что я не знаю, как сохранить не-HTML элементы и сохранить форматирование в том же месте, что и оригинал. Мое решение до сих пор выглядит так:
- Прочитайте файл HTML и выполните итерацию по нему, удаляя строки с элементами, отличными от HTML.
- Создайте объект Document с чистым HTML
- Сделать мои модификации
- Вернитесь через HTML и заново вставьте не HTML-элементы (скрипты), которые я сначала удалил.
- Сохраните документ в файловую систему
Пока это работает, пока размещение не-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("\\<", "<").replaceAll("\\>", ">") + "\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 предоставляет некоторые общие классы, которые облегчили бы эту задачу.
Однако по замыслу эти общие классы зарезервированы только для внутреннего использования.
Это оставило нам четыре варианта: