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

The following code works in Chrome, but not in IE or FireFox. Does anyone 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 snippets of JavaScript ...

 <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 every browser, the "body" definitely contains the xml body, however $ (body) .find ('DataA') does not return results for IE or FireFox.

Update:

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

+6
source share
2 answers

This is a problem with accessing XML nodes without a specified namespace. 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 the XML node search.

+12
source

It works great !!! Try it,

Chrome / Firefox:

 xml.children[0].childNodes[1].innerHTML; 

IE8 + / Safari:

 xml.childNodes[0].childNodes[1].textContent; 

IE8:

 xml.documentElement.childNodes[1].text; 

Sample code here,

 var xml = $.parseXML(XMLDOC); Var xmlNodeValue = ""; if(userAgent.match("firefox")){ xml.children[0].childNodes[1].innerHTML; }else{ // IE8+ xmlNodeValue = xml.childNodes[0].childNodes[1].textContent; } 
0
source

Source: https://habr.com/ru/post/913361/


All Articles