私は 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
子ノードとして 1 つのノードがあり、期待されるシーケンスではありTexts
ませComments
ん)。Serializer
.
さて、改行が保持されるとは思っていません。実際、とにかくスクリプトタグを捨てるつもりですが、コメントを保持したい、または少なくともできるようにしたい場所が他にもあります。エスケープされたコメントが埋め込まれていないテキストを取得します。
何か案は?
更新: NekoHTML がいくつかのタグを壊していたので、JTidy に切り替えましたが、同じ問題が発生しました。ただし、興味深いことに、これはヘッダー内のスクリプト タグだけの問題です。他のコメントは問題なく届きます。そして、JTidy のせいだと私が疑う (願って祈る) 奇妙な追加の JavaScript コメントがあります。
<script type="text/JavaScript"> // <!-- // Hide the JS startTimeout(6000000, "/"); // --> // </script>
JTidy が行っていることは、<script>
内容を CDATA に変換しているように見えます。JTidy の生の出力を stdout に送信すると、次のようになります。
<script type="text/JavaScript">
//<![CDATA[
<!-- // Hide the JS
startTimeout(6000000, "/");
// -->
//]]>
</script>