Ошибка синтаксического анализа XHTML: содержимое элементов должно состоять из правильно сформированных символьных данных или разметки - PullRequest
37 голосов
/ 02 декабря 2010

В качестве продолжения этого вопроса я пытаюсь вставить Javascript в свойство <h:commandButton /> *1003*, поскольку 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?

Ответы [ 5 ]

88 голосов
/ 02 декабря 2010

Facelets - это технология представления на основе XML, которая использует XHTML + XML для генерации вывода HTML. XML имеет пять специальных символов, которые обрабатываются синтаксическим анализатором XML:

  • < начало тега.
  • > конец тега.
  • " начало и конец значения атрибута.
  • ' альтернативное начало и конец значения атрибута.
  • & начало сущности (которое заканчивается ;).

В случае < синтаксический анализатор XML неявно ищет имя тега и конечный тег >. Однако в вашем конкретном случае вы использовали < как оператор JavaScript, а не как объект XML. Это полностью объясняет полученную ошибку разбора XML:

Содержимое элементов должно состоять из правильно сформированных символьных данных или разметки.

По сути, вы пишете код JavaScript не в том месте, XML-документ вместо JS-файла, поэтому вы должны соответственно экранировать все специальные символы XML. < должен быть экранирован как &lt;.

Итак, по сути,

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

должно стать

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

чтобы сделать его XML-верным.

Однако это затрудняет чтение и сопровождение кода JavaScript. Как сказано в превосходном документе Mozilla Developer Network Написание JavaScript для XHTML , вы должны поместить код 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" />

Таким образом, вам не нужно беспокоиться о специальных символах XML в вашем коде JS.

Смотри также:

18 голосов
/ 19 октября 2011

Я наткнулся на этот пост сегодня, так как столкнулся с той же проблемой, и у меня возникла та же проблема с javascript, не работающим с перечисленными выше тегами CDATA.Я исправил теги CDATA, чтобы они выглядели так:

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

your javascript code here

//]]>
</script>

Тогда все работало отлично!

5 голосов
/ 22 мая 2014

Иногда вам понадобится это:

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

, и не только это:

 <![CDATA[
 ]]>
0 голосов
/ 10 мая 2019

У меня остался конфликт git в моем workspace.xml, т.е.

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

, который вызвал неизвестную ошибку тега.Немного раздражает, что он не называет файл.

0 голосов
/ 02 ноября 2015

Я решил это, преобразовав JSP из XHTML в HTML, сделав это в начале:

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
...
...