1. ホーム
  2. javascript

[解決済み】XHTMLのパースでエラー。要素の内容は整形された文字データまたはマークアップで構成されていなければならない

2022-02-21 17:28:40

質問事項

この延長線上として 質問 にJavascriptを挿入しようとしています。 <h:commandButton /> 's onclick プロパティを action はすでにajaxテーブルをレンダリングしています。

やりたいこと リストボックスで選択されたアイテムを取得し、JSFで使用するためのパラメータに変換する。 FileServlet ...すなわち para2=value1&param=value2&param=value3

こんな感じです。

<script type ="text/javascript">
function myScript() {
    var box = document.getElementbyId('myForm:box');
    var length = box.options.length;
    var paramstring = "";
    for (var i = 0; i < length; i++) {
        if (i != (length - 1) {
            if (box.options[i].selected) {
                paramstring = paramstring + "param=" + box.options[i].value + "&amp;";
            }
        } else {
            paramstring = paramstring + "param=" + box.options[i].value;
        }
    }
    if (document.getElementById('myForm:checkbox').checked) {
        window.location='fileServlet? + paramstring;
    }
}
</script>  

ページが読み込まれたときに表示されるもの。 javax.servlet.ServletException: Error Parsing /page.xhtml: Error Traced[line:15] The content of elements must consist of well-formed character data or markup.

例外が発生しないもの

<script type ="text/javascript">
function myScript() {
    var box = document.getElementbyId('myForm:box');
    var length = box.options.length;
    var paramstring = "";

    if (document.getElementById('myForm:checkbox').checked) {
        window.location='fileServlet? + paramstring;
    }
}
</script> 

を追加すると、すぐに for (var i = 0; i < length; i++) あるいは for (var i = 0; i < 10; i++) を実行すると、ページが読み込まれない。なぜ、forループが気に入らないのでしょうか?

解決方法は?

FaceletsはXMLベースのビュー技術で、XHTML+XMLを使用してHTML出力を生成します。XMLには5つの特殊文字があり、XMLパーサーはこれらの文字を特別に扱います。

  • < タグの開始点です。
  • > タグの終端を表します。
  • " 属性値の開始と終了。
  • ' 属性値の代替的な開始と終了。
  • & で終わる)エンティティの開始点。 ; ).

の場合 < この場合、XMLパーサーは暗黙のうちにタグ名と終了タグを探します。 > . しかし、あなたの特定のケースでは、あなたは < をXMLエンティティとしてではなく、JavaScriptの演算子として使用します。これによって、XMLのパース・エラーが発生したことが完全に説明できます。

要素の内容は、整形された文字データまたはマークアップで構成されていなければなりません。

要するに、あなたはJavaScriptのコードを間違った場所、JSファイルではなくXMLドキュメントに書いているのですから、それに応じてすべてのXML特殊文字をエスケープしなければなりません。その < としてエスケープする必要があります。 &lt; .

つまり、本来は

for (var i = 0; i < length; i++) {

になる必要があります。

for (var i = 0; i &lt; length; i++) {

でXML-validになります。

しかし、これではJavaScriptのコードが読みづらく、メンテナンスもしづらくなってしまいます。Mozilla Developer Network の優れたドキュメントに記載されているように XHTMLのためのJavaScriptの書き方 JavaScriptのコードは、文字データ(CDATA)ブロックに配置する必要があります。したがって、JSFの用語では、それは次のようになります。

<h:outputScript>
    <![CDATA[
        // ...
    ]]>
</h:outputScript>

XMLパーサーは、ブロックの内容をXMLとしてではなく、文字データとして解釈するため、XMLの特殊文字をそのまま解釈してしまいます。

しかし、より良い方法は、JSコードを独自のJSファイルに入れ、それを <script src> JSFの用語では <h:outputScript> .

<h:outputScript name="functions.js" target="head" />

こうすることで、JSのコードにXML特有の文字が含まれることを気にする必要がなくなります。さらに、ブラウザがJSファイルをキャッシュする機会を与えるので、平均的なレスポンス・サイズが小さくなるという利点もあります。

こちらもご覧ください。