jqGrid:错误:XML无效

时间:2015-07-23 10:44:08

标签: xml jqgrid

我有一个jqGrid,它填充了来自服务器的自定义XML响应。我设法使用数据类型运行它:" xmlstring",当XML字符串在本地进行硬编码时,我还设法在从jqXHR.responseText的响应中获取XML时运行它,并将其作为一个XML字符串,仍然使用数据类型:" xmlstring",但是当我设置数据类型:" xml"时,我收到以下错误:

您的请求中发生错误:错误:无效的XML:

并且在错误之后列出了HTML页面的代码,它完成了所有这些,而不是XML响应,这对我来说似乎很奇怪。

当我设置数据时发生错误:数据或数据:jqXHR.responseText,甚至是数据:jqXHR.responseXML。

关于这个的任何想法?当使用数据类型:" xml"时,我应该为jqGrid数据传递什么 - data,jqXHR.responseText,jqXHR.responseXML或某些数据成员?

使用数据类型的好处是什么:" xml",而不是数据类型:" xmlstring"?如果我没有设法使用数据类型运行它:" xml",我可以使用数据类型:" xmlstring"使用来自响应的XML,这种方法会出现任何问题吗?

P.S。版本:jqGrid v.4.7.0,jQuery v.2.1.3,Firefox v.39.0和IE 11。

    <!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        var columnNames                 = [  "User ID", "Organization", "Email" ];
        var columnModels                = [
                { name: "userId", visibility: "mandatory", index: "userId", width: 100, xmlmap: '>Reference[name="LogicalMember"]>Object[type="LogicalMember"]>Attribute[name="login"]'},
                { name: "organization", index: "organization", xmlmap:'>Reference[name="Organization"]>Object[type="Organization"]>Attribute[name="name"]' },
                { name: "email", index: "email", width: 80, xmlmap:'>Reference[name="EmailAddresses"]>Object[type="EmailAddress"]>Attribute[name="address"]'},
            ];

            var filterModel                 = [
                { id: 'userId', name: 'User Id', renderer: 'text' },
                { id: 'organization', name: 'Organization', renderer: 'text', rendererOptions: { prompt: 'Domain*' } }
            ];

            var xmlMapping = {root:"SearchResponse", 
                              row:'SearchResponse>Object[type="Contact"]',
                              records:"SearchResponse[total-found]",
                              repeatitems:false,
                              id : "[id]"} 


            // PAGE INITIALIZATION
            //------------------------------------------------------------------
            $(document).ready( function() {
                var searchRequest = createUserSearchRequest('', '', '', '', null, '', '', 50, 1);
                var userSessionID = sessionStorage.getItem("UserSessionID");

                $.ajax({
                    type : "POST",
                    dataType : "xml",
                    url : "../../../../api/",
                    headers: {
                        "UserSessionID": userSessionID,
                        "include_extended_attributes" : false,
                        "ClientVersion" : "3.0",
                        "ClientApplication" : "SomeApp",
                        "Content-type" : "text/xml"
                    },
                    data : searchRequest
                })
                .done(function (data, textStatus, jqXHR) {

                    var xml = jqXHR.responseText;

                    // Table ----------------------
                    var table = $("#table");
                    table.jqGrid(
                        {
                            data : data,
                            datatype:                   "xml",
                            colNames:                   columnNames,
                            colModel:                   columnModels,
                            multiselect:                true,
                            fixedLoadingDiv:            true, 
                            onSelectRow:                selectRow,
                            onSelectAll:                selectAllRow,
                            columnChooserButtonVisible: true,

                            // Sort config
                            cmTemplate:                 { sortable: true },
                            sortname:                   "userId",
                            sortorder:                  "desc",
                            onSortCol:                  applySort,


                            xmlReader: xmlMapping,

                            emptyrecords:               false,
                            columnsStateContextKey:     "some.context",
                            fixedTableHeader:           true
                        });
                    table.jqGrid('hideLoadingBar');
                })
                .fail(function (data, textStatus, jqXHR) {
                    alert("Server error!");
                });

            });
        </script>
    </head>
    <body>
        <div class="grid-content">
            <table id="table"></table>
        </div>
    </body>
</html>

1 个答案:

答案 0 :(得分:0)

我建议你做的第一件事就是验证你是否在页面上正确包含jQuery和jqGrid。您应该修改问题的文本,并包含有关您使用的jQuery和jqGrid的版本信息。了解哪个Web浏览器以及您用于测试的版本可能很重要。

我建议你做的下一件事是使用Fiddler或IE / Chrome / Firefox的开发者工具来跟踪服务器和客户端之间的HTTP流量。您应该检查服务器响应的确切正文和标题。您应该在问题的文本中包含这些信息。最重要的是:哪个值有Content-Type标题。

还有一件事:您应该在调试器中启动HTML页面(按 F12 启动开发人员工具并启动脚本调试)。您将看到错误&#34;无效XML&#34;的确切位置。发生。您可以看到调用堆栈并执行已执行的jQuery或jqGrid行。如果你在你的所有测试中使用非最小化版本的jQuery和jqGrid,情况要好得多。

UPDATED :您发布的代码片段显示您以错误的方式使用jqGrid。首先,你误解了datatype参数的含义。

选项datatype: "xml"datatype: "json"应与url参数结合使用。没有datatype: "xml"的{​​{1}}表示您实现了数据的服务器端分页,而jqGrid应该发送到loadonce: true个请求以加载每页数据。您未指定任何url选项,因此将使用默认值rowNum。在创建jqGrid期间,它会请求将网格填充到20。如果未指定URL,则可能会对当前页面发出请求。

仅当您使用url时,参数data才会被jqGrid使用。 datatype: "local"参数的值应该是带有表示网格行的元素的数组。

因此,如果您要从URL加载XML数据,则必须使用data。如果您想单独请求URL,则应使用mtype: "POST", url: "../../../../api/", datatype: "xml", loadonce: truedatatype: "xml", datastr: data可以是削减XML对象或带有XML数据的字符串。

如果您不从静态XML文件加载数据,我建议您使用JSON而不是XML。对于客户端和服务器端来说,它的速度更快。

更新2:您可以使用以下选项,例如

data