我正在使用 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>
当我从 XOM 文档中提取 script 元素时,它看起来已经被破坏了(SCRIPT 元素有一个Text
子节点,而不是我期望的序列Texts
)Comments
,所以我不认为这是Serializer
出错了.
现在,我不希望保留换行符,事实上我无论如何都会扔掉脚本标签,但是还有其他地方我希望保留评论或至少希望能够获取没有嵌入其中的转义注释的文本。
有任何想法吗?
更新: NekoHTML 正在修改一些标签,所以我切换到 JTidy,我也遇到了同样的问题。有趣的是,这只是标题中的脚本标签的问题。其他评论通过罚款。还有一些奇怪的额外 JavaScript 注释,我怀疑(希望和祈祷)是 JTidy 的错。
<script type="text/JavaScript"> // <!-- // Hide the JS startTimeout(6000000, "/"); // --> // </script>
看起来 JTidy 所做的是将<script>
内容转换为 CDATA;当我将 JTidy 的原始输出发送到标准输出时,我得到了这个:
<script type="text/JavaScript">
//<![CDATA[
<!-- // Hide the JS
startTimeout(6000000, "/");
// -->
//]]>
</script>