web-dev-qa-db-fra.com

Erreur d'analyse XHTML: le contenu des éléments doit être constitué de données de caractères bien formées ou d'un balisage

En tant qu'extension de cette question , j'essaie d'insérer Javascript dans la propriété onclick d'un <h:commandButton /> Car action rend déjà un ajax table.

Ce que je veux faire: obtenir les éléments sélectionnés dans une zone de liste et les transformer en paramètres à utiliser dans un JSF FileServlet. c'est-à-dire para2=value1&param=value2&param=value3

Voici ce que j'ai:

<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>  

Ce que j'obtiens lorsque la page est chargée: javax.servlet.ServletException: Error Parsing /page.xhtml: Error Traced[line:15] The content of elements must consist of well-formed character data or markup.

Ce qui ne déclenche pas d'exception:

<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> 

Dès que j'ajoute for (var i = 0; i < length; i++) ou même for (var i = 0; i < 10; i++) la page ne se charge pas. Pourquoi n'aime-t-il pas la boucle for?

37
luciaengel

Facelets est une technologie de vue basée sur XML qui utilise XHTML + XML pour générer une sortie HTML. XML a cinq caractères spéciaux qui font l'objet d'un traitement spécial par l'analyseur XML:

  • < le début d'une balise.
  • > la fin d'une balise.
  • " le début et la fin d'une valeur d'attribut.
  • ' le début et la fin alternatifs d'une valeur d'attribut.
  • & le début d'une entité (qui se termine par ;).

En cas de <, l'analyseur XML recherche implicitement le nom de la balise et la balise de fin >. Cependant, dans votre cas particulier, vous utilisiez < en tant qu'opérateur JavaScript, pas en tant qu'entité XML. Cela explique totalement l'erreur d'analyse XML que vous avez obtenue:

Le contenu des éléments doit être constitué de données de caractères bien formées ou d'un balisage.

En substance, vous écrivez du code JavaScript au mauvais endroit, un document XML au lieu d'un fichier JS, vous devez donc échapper tous les caractères spéciaux XML en conséquence. Le < doit être échappé par &lt;.

Donc, essentiellement, le

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

doit devenir

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

pour le rendre XML-valide.

Cependant, cela rend le code JavaScript plus difficile à lire et à maintenir. Comme indiqué dans l'excellent document de Mozilla Developer Network Writing JavaScript for XHTML , vous devez placer le code JavaScript dans un bloc de données de caractères (CDATA). Ainsi, en termes JSF, ce serait:

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

L'analyseur XML interprétera le contenu du bloc comme des données de caractère "Vanille simple" et non comme XML et interprétera donc les caractères spéciaux XML "tels quels".

Mais, beaucoup mieux est de simplement mettre le code JS dans son propre fichier JS que vous incluez par <script src>, ou en termes JSF, le <h:outputScript>.

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

De cette façon, vous n'avez pas à vous soucier des caractères spéciaux XML dans votre code JS.

Voir également:

89
BalusC

J'ai rencontré ce message aujourd'hui car je rencontrais le même problème et j'ai eu le même problème de javascript ne fonctionnant pas avec les balises CDATA répertoriées ci-dessus. J'ai corrigé les balises CDATA pour ressembler à:

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

your javascript code here

//]]>
</script>

Ensuite, tout a parfaitement fonctionné!

18
MikeR

Parfois, vous en aurez besoin:

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

et pas seulement:

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

Il me restait un conflit git dans mon espace de travail.xml, c'est-à-dire.

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

qui a provoqué l'erreur de balise inconnue. C'est un peu ennuyeux de ne pas nommer le fichier.

0
GarethReid