我正在使用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>
当元素以名称空间为前缀时,还 必须 添加名称空间:
.find('ns1:return')
:
.find('ns1\:return')
"ns1\:return"
"ns1:return"
.find('ns1\\:return')
看来最后一种解决方案在IE和Firefox中可以正常工作,但在Opera,Chrome或Safari中则不能。为了获得最大的兼容性,请使用带有和不带有假前缀的jQuery选择器,即。"ns1\\:return, return"而不是平原ns1\\:return。
"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对象的变量加前缀美元符号是一种约定,以避免在开发期间/开发后产生混淆。