Комментарии экранируются с помощью NekoHTML (или JTidy) + XOM - PullRequest
0 голосов
/ 16 ноября 2011

Я использую 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"> &lt;!-- // Hide the JS startTimeout(6000000, "/"); // --&gt; </SCRIPT>
    </HEAD>

Когда я извлекаю элемент script из документа XOM, похоже, что он уже искажен (элемент SCRIPT имеет один Text дочерний узел, а не последовательность Texts и Comments, как я ожидал) так что я не думаю, что это Serializer идет не так.

Теперь я не ожидаю сохранения разрывов строк, и на самом деле я собираюсь выбросить теги сценариев в любом случае, но есть другие места, где я хотел бы, чтобы комментарии были сохранены или как минимум, как иметь возможность получать текст без встроенных в него экранированных комментариев.

Есть идеи?


Обновление: NekoHTML искажал некоторые теги, поэтому я переключился на JTidy, и у меня возникла та же проблема. Интересно, однако, что это проблема только для тега script в заголовке; другие комментарии проходят через хорошо. И есть странные дополнительные комментарии JavaScript, которые я подозреваю (надеюсь и молюсь) по вине JTidy.

    <script type="text/JavaScript"> // &lt;!-- // Hide the JS startTimeout(6000000, "/"); // --&gt; // </script>

Похоже, что JTidy конвертирует <script> содержимое в CDATA; когда я отправляю необработанный вывод JTidy в stdout, я получаю это:

<script type="text/JavaScript">
//<![CDATA[
        <!-- // Hide the JS
        startTimeout(6000000, "/");
        // -->
    //]]>
</script>

1 Ответ

0 голосов
/ 17 ноября 2011

Хорошо.Кажется, я нашел объяснение , по крайней мере, для случая JTidy:

Основная проблема заключается в том, что скрипты браузера часто содержат специальные символы XML: '&', '<'']]>' и '<' + '/' + Letter.Если их избежать, чтобы процессоры XML были довольны, сценарий будет нарушен.Согласованное решение заключается в размещении источника в разделе CDATA.Теперь это сделано для обоих тегов.Все идет нормально.Но есть ряд открытых вопросов и возможных непредвиденных последствий.... источник скрипта часто внедряется в комментарии HTML, чтобы предотвратить синтаксический анализ в старых браузерах, которые не поддерживают Javascript.

Комментарии HTML в целом приемлемы;это просто комментарии HTML внутри тегов <script>, которые искажаются, потому что они превращаются в (и выходят внутри) CDATA.XOM, в свою очередь, объединяет CDATA в Text.

Технически, я думаю, это означает, что JTidy сломан, но этого достаточно для моих целей, так как мне не нужен <script> теги вообще.

Тем не менее, если у кого-то есть решение, которое поможет мне получить то, что я вставил, я все равно хотел бы услышать его.

...