当前位置: 首页 > 面试题库 >

解析XHTML时出错:元素的内容必须包含格式正确的字符数据或标记

柴彬
2023-03-14
问题内容

作为此问题的扩展,我正在尝试将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(vari=0;i<10;i++)页面将无法加载。为什么不喜欢for循环?


问题答案:

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

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

在这种情况下<,XML解析器会隐式地寻找标签名称和结束标签>。但是,在您的特定情况下,您使用的<是JavaScript运算符,而不是XML实体。这完全解释了您遇到的XML解析错误:

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

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

因此,基本上,

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

必须成为

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

使它对XML有效。

但是,这使JavaScript代码更难以阅读和维护。如Mozilla开发人员网络出色的文档“为XHTML编写JavaScript”所述,您应该将JavaScript代码放在字符数据(CDATA)块中。因此,按照JSF的说法,它将是:

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

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

但是,更好的方法是将JS代码放在自己的JS文件中,该文件应由<scriptsrc>或以JSF的形式包含在其中<h:outputScript>

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

这样,您无需担心JS代码中的XML特殊字符。



 类似资料:
  • 问题内容: 我在第9行的我的activity_main.xml中收到此错误,我不知道为什么需要帮助。 问题答案: 基本上,它说 整个XML 文件只能有 一个根元素 。您显示的xml片段看起来不完整。只需确保XML文件只有一个根元素,其余的都是该根元素的子元素。希望这可以帮助。如果没有,请发布完整的XML文件,以帮助我们更好地工作。 更新资料 在上面显示的代码中,您有两个根元素。应该只有一个。因此(

  • 我只是散播错误,但主要错误仍然存在:(仍然没有解决方案 C:\magicsaloons\app\src\main\res\libs\YouTubeAndroidPlayerApi.jar:1:2:错误:根元素前面的文档中的标记必须格式正确。:app:MergeDebugResources失败 失败:生成失败,出现异常。 > 错误:任务“:app:MergedebugResources”执行失败。

  • null null null 我只是不知道如何将两者结合起来,这样小数点后才是强制性的。 我如何解决这个问题?

  • 当我为我的反应应用程序构建反应路线时,错误出现了 分析错误:相邻的JSX元素必须包装在封闭标记中。 下面是我的代码 谢谢

  • 我有XML数据在数据库(不是文件),我需要解析它,以提供可能写测试来验证数据在XML xml(内容数据): [致命错误]:14:2:根元素后面的文档中的标记必须格式良好。org.xml.sax.SaxParseException;亚麻编号:14;专栏编号:2;根元素后面的文档中的标记必须格式良好。位于com.sun.org.apache.xerces.internal.parsers.dompar

  • 我正在添加ReCAPTCHA到一个(引导哲基尔)网站,有多个联系人表单。页脚有一个弹出模式,偶尔有一个“立即联系我们”部分,还有几个页面上有一个“请求更多关于____的信息”。 由于我在一个页面上有多个联系人表单,所以我需要显式呈现每个recaptcha。代码如下: 在我的JavaScript中: 在页脚中(包含在所有页面中) (并在页脚底部) 这在一个有两个单独联系人表单的页面上工作得很好(即我