Thursday, January 28, 2010

Re: [jQuery] A different approach to parsing XML, and a little help on processing attributes more efficiently

Are you required to use XML? Why not use JSON and avoid all the parsing?

If you have to use XML I can make some suggestions to speed up the code a bit. But let's see if that is a requirement or not first.

-Mike

On Thu, Jan 28, 2010 at 10:32 AM, augur <312624@gmail.com> wrote:
I spent a couple days looking all over the web for how to do this
well. I did some picking and choosing of methods, and I came up with
this. It works best in Safari, then FireFox, and then Chrome. I have
not tested in IE (do I have to?). It runs up to just over 20,000 lines
of XML well, over that memory is working too hard.

It is a very linear parser that descends from parent to child nodes as
it goes. I commented my code heavily so that it should be pretty
understandable. The one place that I could be a bit more efficient is
in the processing of the node attributes at each level. I would like
to parse out node attributes without specifying them (label and id are
pretty acceptable I guess), so any suggestions there would be great.

:::::The FrameWork::::::

jquery-1.4.min.js


:::::The code::::

$(function(){
 $.ajax({
   type: "GET",
   url: "sites.xml",
   dataType: "xml",
   success: parseXml
 });
       function parseXml(xml) {
       //get root element //
               $(xml).find('sites').each(function(){
                       //get descentdent element = "<element></element" //
                       $(this).find('>element').each(function(){
                               //set variable as this item to pass to the next function //
                               var PARENT = $(this);
                               //get a bunch of attributes of the PARENT element. THIS COULD BE
MORE EFFICIENT //
                               parentLabel = $(this).attr('label');
                               parentID = $(this).attr('id');
                               siteLAT = $(this).attr('lat');
                               siteLNG = $(this).attr('lng');
                               //set variable as string of PARENT variables//
                               var parentBLOCK = "<br/>" +parentLabel +" " + parentID + "<br/>";
                               //set variable to post parentBLOCK//
                               var siteBLOCK = $("div").append(parentBLOCK);
                               //get descentdent element of PARENT //
                               $(PARENT).find('>element').each(function(){
                                       //set variable as this item to pass to the next function //
                                       var THISis = $(this);
                                       //get attributes of the THISis element. THIS COULD BE MORE
EFFICIENT //
                                       thisLabel = $(this).attr('label');
                                       //set variable as string of THISis variables//
                                       var thisBLOCK = thisLabel +": Has this latitude "+ siteLAT +" &
this Longitude "+siteLNG;
                                       //set variable to post thisBLOCK//
                                       siteBLOCK = $("div").append(thisBLOCK + "<br/>");
                                                 //get descentdent element = THISis//
                                                 $(THISis).find('>element').each(function(){
                                                       //get a bunch of attributes of the child elements. THIS COULD
BE MORE EFFICIENT //
                                                       childLabel = $(this).attr('label');
                                                       //get text from nodes of THISis chlidren elements //
                                                       childCopy = $(this).text();
                                                       //set variable as string of THISis child variables//
                                                       var childBLOCK =  childLabel + ": " + childCopy + "<br/>";
                                                       //set variable to post childBLOCK//
                                                       siteBLOCK = $("div").append(childBLOCK);
                                                 });
                                 });

                    });

                });
       }

});

:::::The XML::::

<?xml version="1.0" encoding="UTF-8"?>
<sites>
        <element label="site" id="1" lat="66" lng="104">
               <element label="Location">
                 <element label="city">SF</element>
                 <element label="state">CA</element>
                 <element label="region">West Coast</element>
               </element>
       </element>

   <element label="site" id="2" lat="27" lng="305">
               <element label="Location">
                 <element label="city">Las Vegas</element>
                 <element label="state">NV</element>
                 <element label="region">West</element>
               </element>
       </element>

   <element label="site" id="3" lat="106" lng="35">
               <element label="Location">
                 <element label="city">Pittsburgh</element>
                 <element label="state">Penn</element>
                 <element label="region">North East</element>
               </element>
       </element>

   <element label="site" id="4" lat="77" lng="77">
               <element label="Location">
                 <element label="city">Toledo</element>
                 <element label="state">Ohio</element>
                 <element label="region">North Mid</element>
               </element>
       </element>

</sites>

No comments: