使用命名空间解析XML JQuery Ajax响应
我正在使用JQuery执行Web服务调用,它是ajax函数,我无法解析返回的数据。 当我提醒数据时(alert($(data).find(“return”)。text())为空。我看到服务器响应xml数据,如下所述,当我发出警报(数据)时,我得到[object XMLDocument是.txt = $(data).find(“return”)。text()在我的XML结构下面有一个名称空间有效吗?我可以在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 = $(" "); row.append($(" ").text("#").addClass("ndx")); firstrow.children().each(function () { row.append($(" ").text(this.nodeName)); }); row.appendTo($("table.results thead")); $(xmlDoc).find("row").each(function () { row = $(" "); row.append($(" ").text(ndx + 1).addClass("ndx")); $(this).children().each(function () { row.append($(" ").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:演示
//table displaying results from ajax call here
XML:
value1 value2 value1 value2
当元素以名称空间为前缀时,您还必须添加名称空间:
-
.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 = '' + '' + ' ...
' + ' ' + ' '; // 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对象的前缀是常规,以避免在开发期间/之后出现混淆。