小编典典

使用命名空间解析XML JQuery Ajax响应

ajax

我正在使用JQuery执行Web服务调用,它是ajax函数,无法解析返回的数据。当我警告数据(alert($(data).find(“
return”)。text())为空时,我看到服务器响应xml数据,如下所示,当我警告(数据)时,我得到了[object
XMLDocument给定我的XML结构并在下面使用命名空间,txt = $(data).find(“
return”)。text()有效吗?我可以在firebug中看到完整的xml字符串。

var txt = $(data).find(“ ns1 \:return”)。text(); 适用于Chrome和Firefox,但不适用于Safari

index.js:

$(function () {
$.ajax({
                url: url,
                success: function (data) {
                    var ndx = 0,
                        row,
                        **txt = $(data).find("return").text(),**
                        xml = unescape(txt),
                        xmlDoc = $.parseXML(xml),
                        firstrow = $(xmlDoc).find(
                                "results").children(":first");

                    // populate the table based on the results returned by
                    // the web service
                    $("table.results thead").empty();
                    $("table.results tbody").empty();
                    row = $("<tr/>");

                    row.append($("<th/>").text("#").addClass("ndx"));
                    firstrow.children().each(function () {
                        row.append($("<th/>").text(this.nodeName));
                    });
                    row.appendTo($("table.results thead"));

                    $(xmlDoc).find("row").each(function () {
                        row = $("<tr/>");
                        row.append($("<td/>").text(ndx + 1).addClass("ndx"));
                        $(this).children().each(function () {
                            row.append($("<td/>").text($(this).text()));
                        });
                        row.appendTo($("table.results tbody"));
                        ndx++;
                    });

                    // clear the table if no results were returned
                    if (ndx == 0) {
                        // no rows returned
                        $("table.results thead").empty();
                        $("table.results tbody").empty();
                    }

                    statusNotice("Records Returned: " + ndx);
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    // display the error returned by the web service
                    var xmlDoc = $(XMLHttpRequest.responseXML);
                    statusError(xmlDoc.find("Text").text());
                },          
                complete: function(XMLHttpRequest, textStatus) {
                    // hide the busy dialog
                    $("#busy-dlg").dialog("close");
                }
            });
       });

index.html: 演示

<script type="text/javascript" src="js/jquery-1.6.4.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-min.js"></script>
<script type="text/javascript" src="js/jquery.layout-latest.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</head>
<body>
//table displaying results from ajax call here
</body>
</html>

XML:

<ns1:executeResponse xmlns:ns1="http://sqlws.test.com">
<ns1:return>
    <results>
        <row>
            <attribute1>value1</attribute1>
            <attribute2>value2</attribute2>
        </row>
        <row>
            <attribute1>value1</attribute1>
            <attribute2>value2</attribute2>
        </row>
    </results>
</ns1:return>
</ns1:executeResponse>

阅读 217

收藏
2020-07-26

共1个答案

小编典典

当元素以名称空间为前缀时,还 必须 添加名称空间:

  • .find('ns1:return')不起作用,因为:jQuery用作伪选择器。
  • .find('ns1\:return')也不起作用,因为字符串中的单个反斜杠用作转义字符。"ns1\:return"变为"ns1:return"与前一个相等。
  • .find('ns1\\:return') 应该使用。双反斜杠用于转义冒号。

看来最后一种解决方案在IE和Firefox中可以正常工作,但在Opera,Chrome或Safari中则不能。为了获得最大的兼容性,请使用带有和不带有假前缀的jQuery选择器,即。"ns1\\:return, return"而不是平原ns1\\:return

演示:http :
//jsfiddle.net/5BQjv/51/

// For example, this is the result:
var data = '<ns1:executeResponse xmlns:ns1="http://sqlws.test.com">' +
               '<ns1:return>' + 
                   '<results> <row> ... </row> </results>' +
               '</ns1:return>' +
           '</ns1:executeResponse>';

// The very first thing is to parse the string as XML. NOT later!
var $xmlDoc = $($.parseXML(data));

// Then, look for the element with the namespace:
var $txt = $xmlDoc.find('ns1\\:return, return');

// No need to use unescape or something, just use DOM manipulation:
// `results` is the immediate child. Don't use .find, but .children
var $firstrow = $txt.children("results").children(":first");

您可能已经注意到,我为一些变量加了美元符号。按照惯例,为引用jQuery对象的变量加前缀美元符号是一种约定,以避免在开发期间/开发后产生混淆。

2020-07-26