[英]Parsing XML JQuery Ajax Response with Namespace
我正在使用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 = $("<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')
不起作用,因为:
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对象的前缀是常规,以避免在开发期间/之后出现混淆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.