【问题标题】:Comments getting escaped with NekoHTML (or JTidy) + XOM使用 NekoHTML(或 JTidy)+ XOM 转义评论
【发布时间】:2011-11-16 19:28:35
【问题描述】:

我正在使用 NekoHTML 清理一些 HTML,然后将其提供给 XOM 以获取对象模型。在此过程中的某个地方,cmets 正在逃脱。

这是一个输入 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 出了问题。

现在,我不希望保留换行符,事实上我还是要扔掉脚本标签,但是还有其他地方我希望保留 cmets 或至少希望保留能够在没有嵌入转义 cmets 的情况下获取文本。

有什么想法吗?


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

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

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

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

【问题讨论】:

    标签: jtidy xom cyberneko


    【解决方案1】:

    好的。我似乎至少在 JTidy 案例中找到了explanation

    基本问题是浏览器脚本通常会包含特殊的 XML 字符:'&amp;''&lt;'']]&gt;''&lt;' + '/' + Letter。如果这些被转义以使 XML 处理器高兴,它将破坏 脚本。商定的解决方案是将源放在 CDATA 中 部分。现在对 和 标签都已完成此操作。至今, 超好的。但是有一些未解决的问题和可能的意外 结果。 ...脚本源通常嵌入在 HTML 中 cmets 以防止不支持的旧浏览器解析 Javascript。

    HTML cmets 通常是可以的;只是&lt;script&gt; 标记中的HTML cmets 会被破坏,因为它们已变成(并在其中转义)CDATA。 XOM,反过来,merges CDATA into Text

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      相关资源
      最近更新 更多