解析XHTML时出错:元素的内容必须由格式良好的字符数据或标记组成

时间:2010-12-02 18:35:38

标签: javascript jsf jsf-2 xhtml facelets

作为此question的扩展,我正在尝试将Javascript插入<h:commandButton />的{​​{1}}属性,因为onclick已经呈现了ajax表。< / p>

我想做什么: 获取列表框中的选定项并将其转换为要在JSF action中使用的参数。即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循环?

5 个答案:

答案 0 :(得分:87)

Facelets是一种基于XML的视图技术,它使用XHTML + XML生成HTML输出。 XML有五个特殊字符,由XML解析器进行特殊处理:

  • <标记的开头。
  • >标记的结尾。
  • "属性值的开头和结尾。
  • '替代属性值的开始和结束。
  • &实体的开头(以;结尾)。

对于<,XML解析器隐式查找标记名称和结束标记>。但是,在您的特定情况下,您使用<作为JavaScript运算符,而不是XML实体。这完全解释了您获得的XML解析错误:

  

元素的内容必须包含格式良好的字符数据或标记。

本质上,您在错误的位置编写JavaScript代码,而不是JS文件,因此您应该相应地转义所有XML特殊字符。必须将<转义为&lt;

所以,基本上,

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

必须成为

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

使其符合XML格式。

然而,这使得JavaScript代码更难以阅读和维护。正如Mozilla Developer Network的优秀文档Writing JavaScript for XHTML中所述,您应该将JavaScript代码放在字符数据(CDATA)块中。因此,在JSF术语中,那将是:

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

XML解析器会将块的内容解释为“普通的vanilla”字符数据,而不是XML,因此可以“按原样”解释XML特殊字符。

但是,更好的方法是将JS代码放在由<script src>包含的JS文件中,或者用JSF术语<h:outputScript>包含。

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

这样您就不必担心JS代码中的XML特殊字符了。

另见:

答案 1 :(得分:18)

今天我遇到了这个帖子,因为我遇到了同样的问题,并且遇到了与上面列出的CDATA标签无法运行的javascript相同的问题。我将CDATA标签更正为:

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

your javascript code here

//]]>
</script>

然后一切都很完美!

答案 2 :(得分:5)

有时你需要这个:

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

而不仅仅是这个:

 <![CDATA[
 ]]>

答案 3 :(得分:0)

我的工作区.xml中存在git冲突 即

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

这导致未知标签错误。它没有命名文件有点烦人。

答案 4 :(得分:-3)

我解决了将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>
...