为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

侃侃尔雅 2019-08-08 15:01:56
解析XHTML时出错:元素的内容必须由格式良好的字符数据或标记组成在列表框中获取所选项目并将其转换为要在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循环?
查看完整描述

3 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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的优秀文档Writing JavaScript for XHTML中所述,您应该将JavaScript代码放在字符数据(CDATA)块中。因此,在JSF术语中,那将是:

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

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

但是,更好的是将JS代码放在它自己的JS文件中<script src>,或者用JSF术语表示<h:outputScript>

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

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


查看完整回答
反对 回复 2019-08-08
?
精慕HU

TA贡献1845条经验 获得超8个赞

因为我遇到了同样的问题,并且遇到了与上面列出的CDATA标签一起运行的javascript问题。我更正了CDATA标签,如下所示:

<script type="text/javascript">//<![CDATA[ your javascript code here//]]></script>

然后一切都很完美!


查看完整回答
反对 回复 2019-08-08
?
达令说

TA贡献1821条经验 获得超6个赞

有时你会需要这个:

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

而且不仅如此:

 <![CDATA[
 ]]>


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 722 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信