Я использую NekoHTML для очистки HTML, а затем передаю его в XOM, чтобы получить объектную модель. Где-то в ходе этого комментарии становятся экранированными.
Вот соответствующий пример ввода HTML (большая часть <head>
вырезана для ясности):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<script type="text/JavaScript">
<!-- // Hide the JS
startTimeout(6000000, "/");
// -->
</script>
Вот код:
// XOMSafeSAXParser is the Neko SAXParser extended to allow
// XOM to set the (unnecessary in this case) features
// external-general-entities and external-parameter-entities
XMLReader reader = new XOMSafeSAXParser();
Builder xomBuilder = new Builder(reader);
Reader input = ...; // file, resource, etc.
Document doc = xomBuilder.build(input);
Serializer s = new Serializer(System.out, "UTF-8");
s.setIndent(4);
s.setMaxLength(200);
s.write(doc);
s.flush();
Вот соответствующий вывод:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML lang="en">
<HEAD>
<SCRIPT type="text/JavaScript"> <!-- // Hide the JS startTimeout(6000000, "/"); // --> </SCRIPT>
</HEAD>
Когда я извлекаю элемент script из документа XOM, похоже, что он уже искажен (элемент SCRIPT имеет один Text
дочерний узел, а не последовательность Texts
и Comments
, как я ожидал) так что я не думаю, что это Serializer
идет не так.
Теперь я не ожидаю сохранения разрывов строк, и на самом деле я собираюсь выбросить теги сценариев в любом случае, но есть другие места, где я хотел бы, чтобы комментарии были сохранены или как минимум, как иметь возможность получать текст без встроенных в него экранированных комментариев.
Есть идеи?
Обновление: NekoHTML искажал некоторые теги, поэтому я переключился на JTidy, и у меня возникла та же проблема. Интересно, однако, что это проблема только для тега script в заголовке; другие комментарии проходят через хорошо. И есть странные дополнительные комментарии JavaScript, которые я подозреваю (надеюсь и молюсь) по вине JTidy.
<script type="text/JavaScript"> // <!-- // Hide the JS startTimeout(6000000, "/"); // --> // </script>
Похоже, что JTidy конвертирует <script>
содержимое в CDATA; когда я отправляю необработанный вывод JTidy в stdout, я получаю это:
<script type="text/JavaScript">
//<![CDATA[
<!-- // Hide the JS
startTimeout(6000000, "/");
// -->
//]]>
</script>