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子ノードとして 1 つのノードがあり、期待されるシーケンスではありTextsませCommentsん)。Serializer.

さて、改行が保持されるとは思っていません。実際、とにかくスクリプトタグを捨てるつもりですが、コメントを保持したい、または少なくともできるようにしたい場所が他にもあります。エスケープされたコメントが埋め込まれていないテキストを取得します。

何か案は?


更新: NekoHTML がいくつかのタグを壊していたので、JTidy に切り替えましたが、同じ問題が発生しました。ただし、興味深いことに、これはヘッダー内のスクリプト タグだけの問題です。他のコメントは問題なく届きます。そして、JTidy のせいだと私が疑う (願って祈る) 奇妙な追加の JavaScript コメントがあります。

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

JTidy が行っていることは、<script>内容を CDATA に変換しているように見えます。JTidy の生の出力を stdout に送信すると、次のようになります。

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

1 に答える 1

0

わかった。少なくとも JTidy ケースの説明を見つけたようです。

基本的な問題は、ブラウザー スクリプトに特殊な XML 文字 ( '&''<'']]>'および) が含まれていることが多いこと'<' + '/' + Letterです。XML プロセッサを満足させるためにこれらをエスケープすると、スクリプトが壊れます。合意された解決策は、CDATA セクション内にソースを配置することです。これは、 と タグの両方に対して行われるようになりました。ここまでは順調ですね。しかし、未解決の問題がいくつかあり、意図しない結果が生じる可能性があります。... スクリプト ソースは、Javascript をサポートしていない古いブラウザーによる解析を防ぐために、HTML コメントに埋め込まれていることがよくあります。

一般に、HTML コメントは問題ありません。タグ内の HTML コメント<script>は、CDATA に変換 (およびその中でエスケープ) されるため、壊れてしまいます。次に、XOM はCDATA をTextにマージします。

<script>技術的には、これは JTidy が壊れていることを意味すると思いますが、タグはまったく必要ないので、私の目的には十分です。

それでも、誰かが私が入れたものを私にもたらす解決策を持っているなら、私はそれを聞きたい.

于 2011-11-16T23:08:03.257 に答える