我正在尝试使用jQuery解析xml响应,只输出一个页面的元素,但我没有成功。
以下是我用于响应的代码&解析它。
$.ajax({
url: UCMDBServiceUrl,
type: "POST",
dataType: "xml",
data: soapMessage,
success: UCMDBData,
crossDomain: true,
contentType: "text/xml; charset=\"utf-8\""
});
alert("Sent2");
return false;
}
function UCMDBData(xmlHttpRequest, status, msg)
{
alert("Came back1");
$(xmlHttpRequest.responseXML).find('tns:CIs').each(function()
{
alert("Came back2");
$(this).find("ns0:CI").each(function()
{
alert("Came back3");
$("#output").append($(this).find("ns0:ID").text());
});
});
}
我收到“Came back1”的警报但它似乎没有进一步。下面是我尝试使用上面的jquery代码解析的XML响应。我最终试图退出响应的文本是在这个元素
中<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header />
<soapenv:Body>
<tns:getFilteredCIsByTypeResponse xmlns:ns0="http://schemas.hp.com/ucmdb/1/types" xmlns:ns1="http://schemas.hp.com/ucmdb/ui/1/types" xmlns:ns2="http://schemas.hp.com/ucmdb/1/types/query" xmlns:ns3="http://schemas.hp.com/ucmdb/1/types/props" xmlns:ns4="http://schemas.hp.com/ucmdb/1/types/classmodel" xmlns:ns5="http://schemas.hp.com/ucmdb/1/types/impact" xmlns:ns6="http://schemas.hp.com/ucmdb/1/types/update" xmlns:ns7="http://schemas.hp.com/ucmdb/discovery/1/types" xmlns:ns8="http://schemas.hp.com/ucmdb/1/types/history" xmlns:tns="http://schemas.hp.com/ucmdb/1/params/query">
<tns:CIs>
<ns0:CI>
<ns0:ID>4d030502995a00afd989d3aeca2c990c</ns0:ID>
<ns0:type>nt</ns0:type>
<ns0:props>
<ns0:strProps>
<ns0:strProp>
<ns0:name>name</ns0:name>
<ns0:value>prodoo</ns0:value>
</ns0:strProp>
</ns0:strProps>
<ns0:booleanProps>
<ns0:booleanProp>
<ns0:name>host_iscomplete</ns0:name>
<ns0:value>false</ns0:value>
</ns0:booleanProp>
</ns0:booleanProps>
</ns0:props>
</ns0:CI>
</tns:CIs>
<tns:chunkInfo>
<ns0:numberOfChunks>0</ns0:numberOfChunks>
<ns0:chunksKey>
<ns0:key1 />
<ns0:key2 />
</ns0:chunksKey>
</tns:chunkInfo>
</tns:getFilteredCIsByTypeResponse>
</soapenv:Body>
</soapenv:Envelope>
所以我的问题是如何正确解析数据?我相信代码语法是正确的,但我没有得到预期的返回结果。感谢您的帮助,谢谢。
修改
我已经将我的代码修改为以下内容,就像建议一样,但仍然没有运气:
$.ajax({
url: UCMDBServiceUrl,
type: "POST",
dataType: "xml",
data: soapMessage,
success: UCMDBData,
crossDomain: true,
contentType: "text/xml;"
});
alert("Sent2");
return false;
}
function UCMDBData(data, textStatus, jqXHR) {
alert("Came back1");
$(data).find('tns:CIs').each(function () {
alert("Came back2");
$(this).find("ns0:CI").each(function () {
alert("Came back3");
$("#output").append($(this).find("ns0:ID").text());
document.AppServerForm.outputtext.value = document.AppServerForm.outputtext.value + "http://localhost:8080/ucmdb/cms/directAppletLogin.do?objectId=" + $(this).find('ns0:ID').text() +"&infopane=VISIBLE&navigation=true&cmd=ShowRelatedCIs&interfaceVersion=8.0.0&ApplicationMode=ITU&customerID=1&userName=admin&userPassword=admin";
});
});
}
当我执行唯一的警报消息时,我收到的是“Came back1”,这意味着代码仍未通过jquery正确地通过xml。还有其他建议吗?
答案 0 :(得分:2)
命名空间范围的名称需要稍微不同地处理。根据这个答案: jQuery XML parsing with namespaces 您需要使用属性选择器[@ nodeName = tns:CIs]。
对于晚于1.3的jQuery版本,您可能需要删除“@”。另一个建议是逃避冒号:.find('tns \:CIs'),这是hacky,因为它将语法前缀与语义命名空间(uri)混为一谈。所以如果前缀改变了,这个方法就会破坏。更正确的答案将识别前缀到名称空间uri的映射。 jquery-xmlns plugin for namespace-aware selectors在这方面看起来很有希望。
答案 1 :(得分:1)
你的jQuery成功函数是错误的形式。它必须是
的形式function UCMDBData(data, textStatus, jqXHR) {
alert("Came back1");
$(data).find('tns:CIs').each(function () {
alert("Came back2");
$(this).find("ns0:CI").each(function () {
alert("Came back3");
$("#output").append($(this).find("ns0:ID").text());
});
});
}
此外,在您的$.ajax
函数中,将contentType
行更改为contentType: "text/xml"
而不是之前的行(假设您将XML发送到服务器)。< / p>
有关详细信息,请参阅jQuery.ajax() documentation。
答案 2 :(得分:1)
根据你的评论,为什么用jQuery做一些疯狂的事情?只需使用javascript本身!
var open = '<ns0:ID>';
var close = '</ns0:ID>';
var start = obj.indexOf(open) + open.length;
var end = obj.indexOf(close);
var result = obj.slice(start, end);
这是一个显示实际效果的jsfiddle。
答案 3 :(得分:0)
可能正确的语法是
success: function(xml) {
$(xml).find('tns:CIs').each(function() {
......