webentwicklung-frage-antwort-db.com.de

Fehler beim Parsen von XHTML: Der Inhalt von Elementen muss aus wohlgeformten Zeichendaten oder Markups bestehen

Als Erweiterung von question versuche ich, Javascript in die onclick -Eigenschaft eines <h:commandButton /> Einzufügen, da action bereits einen Ajax rendert Tabelle.

Was ich tun möchte: Holen Sie sich die ausgewählten Elemente in ein Listenfeld und wandeln Sie sie in Parameter um, die in einem JSF FileServlet verwendet werden sollen. d.h. para2=value1&param=value2&param=value3

Folgendes habe ich:

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

Was bekomme ich, wenn die Seite geladen wird: javax.servlet.ServletException: Error Parsing /page.xhtml: Error Traced[line:15] The content of elements must consist of well-formed character data or markup.

Was löst keine Ausnahme aus:

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

Sobald ich for (var i = 0; i < length; i++) oder sogar for (var i = 0; i < 10; i++) hinzufüge, wird die Seite nicht geladen. Warum mag es nicht die for-Schleife?

37
luciaengel

Facelets ist eine XML-basierte Ansichtstechnologie, die XHTML + XML verwendet, um HTML-Ausgaben zu generieren. XML hat fünf Sonderzeichen, die vom XML-Parser speziell behandelt werden:

  • < Start eines Tags.
  • > Das Ende eines Tags.
  • " Beginn und Ende eines Attributwerts.
  • ' Der alternative Anfang und das alternative Ende eines Attributwerts.
  • & Der Anfang einer Entität (der mit ; Endet).

Im Fall von < Sucht der XML-Parser implizit nach dem Tag-Namen und dem End-Tag >. In Ihrem speziellen Fall haben Sie jedoch < Als JavaScript-Operator und nicht als XML-Entität verwendet. Dies erklärt den aufgetretenen XML-Parsing-Fehler vollständig:

Der Inhalt von Elementen muss aus wohlgeformten Zeichendaten oder Markierungen bestehen.

Im Wesentlichen schreiben Sie JavaScript-Code an der falschen Stelle, ein XML-Dokument anstelle einer JS-Datei, sodass Sie alle XML-Sonderzeichen entsprechend maskieren sollten. Der < Muss als &lt; Maskiert werden.

Also im Wesentlichen die

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

muss werden

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

um es XML-gültig zu machen.

Dies erschwert jedoch das Lesen und Verwalten des JavaScript-Codes. Wie in Mozilla Developer Networks ausgezeichnetem Dokument Schreiben von JavaScript für XHTML angegeben, sollten Sie den JavaScript-Code in einem CDATA-Block (Character Data) platzieren. In JSF-Begriffen wäre das also:

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

Der XML-Parser interpretiert den Inhalt des Blocks als "normale Vanilla" -Zeichen und nicht als XML und interpretiert daher die XML-Sonderzeichen "wie sie sind".

Viel besser ist es jedoch, den JS-Code einfach in eine eigene JS-Datei zu schreiben, die Sie mit <script src> Oder in JSF-Begriffen mit <h:outputScript> Einfügen.

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

Auf diese Weise müssen Sie sich nicht um XML-Sonderzeichen in Ihrem JS-Code kümmern.

Siehe auch:

89
BalusC

Ich bin heute auf diesen Beitrag gestoßen, da ich auf das gleiche Problem gestoßen bin und das gleiche Problem hatte, dass Javascript nicht mit den oben aufgeführten CDATA-Tags ausgeführt wird. Ich habe die CDATA-Tags folgendermaßen korrigiert:

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

your javascript code here

//]]>
</script>

Dann hat alles perfekt geklappt!

18
MikeR

Manchmal benötigen Sie Folgendes:

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

und nicht nur das:

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

Ich hatte einen Git-Konflikt in meiner workspace.xml, d. H.

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

welches den unbekannten Umbaufehler verursachte. Es ist etwas ärgerlich, dass die Datei nicht benannt wird.

0
GarethReid