如何使用jQuery解析XML响应

时间:2011-11-29 22:48:35

标签: javascript jquery html xml

我正在尝试使用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。还有其他建议吗?

4 个答案:

答案 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() {
    ......