0

我正在使用 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>

当我从 XOM 文档中提取 script 元素时,它看起来已经被破坏了(SCRIPT 元素有一个Text子节点,而不是我期望的序列TextsComments,所以我不认为这是Serializer出错了.

现在,我不希望保留换行符,事实上我无论如何都会扔掉脚本标签,但是还有其他地方我希望保留评论或至少希望能够获取没有嵌入其中的转义注释的文本。

有任何想法吗?


更新: NekoHTML 正在修改一些标签,所以我切换到 JTidy,我也遇到了同样的问题。有趣的是,这只是标题中的脚本标签的问题。其他评论通过罚款。还有一些奇怪的额外 JavaScript 注释,我怀疑(希望和祈祷)是 JTidy 的错。

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

看起来 JTidy 所做的是将<script>内容转换为 CDATA;当我将 JTidy 的原始输出发送到标准输出时,我得到了这个:

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

1 回答 1

0

好的。我似乎至少找到了 JTidy 案例的解释:

基本问题是浏览器脚本通常会包含特殊的 XML 字符:'&''<'和. 如果这些被转义以使 XML 处理器满意,它将破坏脚本。商定的解决方案是将源放在 CDATA 部分中。现在对 和 标签都已完成此操作。到现在为止还挺好。但是有许多未解决的问题和可能的意外后果。...脚本源通常嵌入在 HTML 注释中,以防止不支持 Javascript 的旧浏览器解析。']]>''<' + '/' + Letter

一般的 HTML 注释是可以的;只是<script>标签内的 HTML 注释会被破坏,因为它们已变成(并在其中转义)CDATA。XOM 反过来将 CDATA 合并到Text.

从技术上讲,我认为这意味着 JTidy 已损坏,但对于我的目的来说已经足够了,因为我根本不需要<script>标签。

尽管如此,如果有人有解决方案让我摆脱我的投入,我仍然想听听。

于 2011-11-16T23:08:03.257 回答