Ошибка синтаксического анализа XHTML: содержимое элементов должно состоять из хорошо сформированных символьных данных или разметки
Как расширение этого question, я пытаюсь вставить Javascript в свойство <h:commandButton />
onclick
, поскольку action
уже выполняет ajax.
Что я хочу сделать:
Получите выбранные элементы в списке и включите их в параметры, которые будут использоваться в JSF FileServlet
. т.е. para2=value1¶m=value2¶m=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 + "&";
}
} 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. <
должен быть экранирован как <
.
Итак, по существу,
for (var i = 0; i < length; i++) {
должен стать
for (var i = 0; i < 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>
...