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

Как расширение этого question, я пытаюсь вставить Javascript в свойство <h:commandButton /> 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?

Ответы

Ответ 1

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 будет интерпретировать содержимое блока как символьные данные "plain vanilla", а не как XML и, следовательно, интерпретировать специальные символы XML "как есть".

Но гораздо лучше просто поставить JS-код в свой собственный JS файл, который вы включите в <script src> или в терминах JSF, <h:outputScript>.

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

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

См. также:

Ответ 2

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

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

your javascript code here

//]]>
</script>

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

Ответ 3

Иногда вам понадобится следующее:

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

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

 <![CDATA[
 ]]>

Ответ 4

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

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

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

Ответ 5

Я решил преобразовать 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>
...