web-dev-qa-db-ja.com

XHTMLの解析エラー:要素のコンテンツは整形式の文字データまたはマークアップで構成されている必要があります

この拡張機能として questiononclickはすでにajaxテーブルをレンダリングしているため、_<h:commandButton />_のactionプロパティにJavascriptを挿入しようとしています。

やりたいこと:リストボックスで選択した項目を取得し、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ループが好きではないのですか?

37
luciaengel

Faceletsは、XHTML + XMLを使用してHTML出力を生成するXMLベースのビューテクノロジーです。 XMLには、XMLパーサーによる特別な処理を持つ5つの特殊文字があります。

  • <タグの開始。
  • >タグの終わり。
  • "属性値の開始と終了。
  • '属性値の代替の開始と終了。
  • &エンティティの開始(;で終わる)。

<の場合、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を有効にします。

ただし、これによりJavaScriptコードの読み取りと保守が難しくなります。 Mozilla Developer Networkの優れたドキュメント XHTML用JavaScriptの記述 で述べられているように、JavaScriptデータを文字データ(CDATA)ブロックに配置する必要があります。したがって、JSFの用語では、次のようになります。

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

XMLパーサーは、ブロックのコンテンツをXMLではなく「プレーンバニラ」文字データとして解釈し、XML特殊文字を「そのまま」解釈します。

ただし、<script src>、またはJSF用語で<h:outputScript>でインクルードする独自のJSファイルにJSコードを配置することをお勧めします。

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

これにより、JSコードでXMLの特殊文字を心配する必要がなくなります。

こちらもご覧ください:

89
BalusC

同じ問題にぶつかり、上記のCDATAタグでjavascriptが実行されないという同じ問題を抱えていたため、今日この投稿に出くわしました。 CDATAタグを次のように修正しました。

<script type="text/javascript">
//<![CDATA[ 

your javascript code here

//]]>
</script>

その後、すべてが完璧に機能しました!

18
MikeR

時々これが必要になります:

 /*<![CDATA[*/
 /*]]>*/

これだけでなく:

 <![CDATA[
 ]]>
5
Jad B.

私のworkspace.xmlにgitの競合が残っていました.

<<<<———————HEAD

不明なタグエラーが発生しました。ファイルに名前を付けないのは少し面倒です。

0
GarethReid