使用NekoHTML(或JTidy)+ XOM进行转义的评论

时间:2011-11-16 19:28:36

标签: jtidy xom cyberneko

我正在使用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元素有一个Text节点作为子节点,而不是Texts和{{1的序列我希望),所以我不认为Comments出错了。

现在,我不希望保留换行符,实际上我还是要抛出脚本标签,但是还有其他地方我希望保留评论或者至少喜欢能够在没有嵌入其中的转义注释的情况下获取文本。

有什么想法吗?


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

Serializer

看起来JTidy正在做的是将 <script type="text/JavaScript"> // &lt;!-- // Hide the JS startTimeout(6000000, "/"); // --&gt; // </script> 内容转换为CDATA;当我将JTidy的原始输出发送到stdout时,我得到了这个:

<script>

1 个答案:

答案 0 :(得分:0)

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

  

基本问题是浏览器脚本通常包含特殊的XML   字符:'&''<'']]>''<' + '/' + Letter。如果这些被转义以使XML处理器满意,它将打破   脚本。商定的解决方案是将来源置于CDATA内   部分。现在对两个和标签都已完成。至今,   超好的。但是有一些悬而未决的问题,可能是无意的   后果。 ...脚本源通常嵌入在HTML中   注释以防止不支持的旧浏览器进行解析   的JavaScript。

HTML评论一般都没问题;它只是<script>标签内的HTML注释被破坏,因为它们在CDATA中被转换(并在其中转义)。反过来,XOM merges CDATA into Text

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

尽管如此,如果有人有解决方案可以让我知道我的内容,我仍然希望听到它。