Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

$(xml).find('someElement') : pulling values with jquery from xml with Namespaces

The following code works in Chrome, but not IE, or FireFox. Does someone know the appropriate cross browser code?

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
    <a:Action s:mustUnderstand="1">http://tempuri.org/SubscriptionService/Update</a:Action>
    <netdx:Duplex xmlns:netdx="http://schemas.microsoft.com/2008/04/netduplex">
        <netdx:Address>http://docs.oasis-open.org/ws-rx/wsmc/200702/anonymous?id=4ed8a7ee-b124-e03e-abf0-a294e99cff73</netdx:Address>
        <netdx:SessionId>177b4f47-5664-d96c-7ffa-0a8d879b67dd</netdx:SessionId>
    </netdx:Duplex>
</s:Header>
<s:Body>
    <Update xmlns="http://tempuri.org/">
        <lstResponseStruct xmlns:b="http://schemas.datacontract.org/2004/07/FSS.Libs.Core.InterprocessData.RMS" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <b:DataA>
                <b:ValueA>1.339565</b:ValueA>
                <b:Status>None</b:Status>
            </b:DataA>
            <b:DataA>
                <b:ValueA>120.3717</b:ValueA>
                <b:Status>None</b:Status>
            </b:DataA>
            <b:DataA>
                <b:ValueA>133.563116</b:ValueA>
                <b:Status>None</b:Status>
            </b:DataA>
            <b:DataA>
                <b:ValueA>-0.0059159999999999994</b:ValueA>
                <b:Status>None</b:Status>
            </b:DataA>
        </lstResponseStruct>
    </Update>
</s:Body>

Here are the JavaScript snippets...

<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>

var nodes;
if (typeof DOMParser != "undefined")
    nodes = ((new DOMParser()).parseFromString(request.responseText, "application/xml")).getElementsByTagName("*");
else {
    request.responseXML.loadXML(request.responseText);
    nodes = request.responseXML.getElementsByTagName("*");
} 

for (var i = 0; i < nodes.length; i++) {
    var element = nodes[i];
    ...
    if ((element.localName == "Body" || element.baseName == "Body") && element.namespaceURI == "http://www.w3.org/2003/05/soap-envelope") {
        body = element;
        break;
}

$(body).find('DataA').each(function () {
    ... Do something
}

for some reason, in each browser "body" definitely contains the body xml, however the $(body).find('DataA') doesn't return results for IE or FireFox.

Update:

Adding the namespace $(body).find('b\\:DataA') works well for FireFox and IE, but breaks Chrome!

like image 863
antwarpes Avatar asked Apr 16 '12 20:04

antwarpes


1 Answers

It was a problem accessing XML nodes without the namespace specified. For some reason Chrome doesn't want to see the namespace.

I found that the "b\:DataA" selector works for FireFox and IE, and the "DataA" selector works for Chrome.

so...

$(xData.responseXML).find("b\\:DataA, DataA").each(function() { // Do Stuff }); 

Seems to work for IE, FireFox, and Chrome.

see http://www.steveworkman.com/html5-2/javascript/2011/improving-javascript-xml-node-finding-performance-by-2000/ for more information and ways to improve XML node finding performance.

like image 74
antwarpes Avatar answered Oct 13 '22 00:10

antwarpes