Skip to content Skip to sidebar Skip to footer

Loop Through Xml Parser?

I am developing an app, where on the click of a button, a list of the document information stored in an XML file is shown on screen in a
    tag. The current JavaScript in t

Solution 1:

Use following loop code.

<script>
    xmlDoc = $.parseXML( xml ),
    $xml = $( xmlDoc );
    var documents = $xml.find('document_list');

    documents.children('document').each(function() {
      var name = $(this).find('document_name').text();
      var file_type = $(this).find('file_type').text();
      var file_location = $(this).find('file_location').text();

      // now do whatever you like with above variable
    });
</script>

Solution 2:

Using Irfan's answer as a base, to get the values into your labels add a counter, then just insert the values grabbed from the XML parsing loop into the corresponding span.

<script>
    xmlhttp = newXMLHttpRequest();
    xmlhttp.open("GET", "TestInfo.xml", false);
    xmlhttp.send();

    xmlDoc = xmlhttp.responseXML;
    $xml = $( xmlDoc );
    var documents = $xml.find('document_list');

    var doccount = 0;

    //will be used to find the HTML elementsvar namelabel = "docname"; 
    var typelabel = "filetype"; 
    var locationlabel = "fileloc";

    documents.children('document').each(function() {
      var name = $(this).find('document_name').text();
      var file_type = $(this).find('file_type').text();
      var file_location = $(this).find('file_location').text();

      //after the first document we need to add the number to the span idif(doccount > 0){ 
         namelabel = "docname" + doccount;
         typelabel = "filetype" + doccount;
         locationlabel = "fileloc" + doccount;
      }

      //insert the XML values into the label
      $('span#'+namelabel).html(name);
      $('span#'+typelabel).html(file_type);
      $('span#'+locationlabel).html(file_location);  

      //increment the counter
      doccount++;
    });
</script>

Solution 3:

Here is a native JavaScript implementation so you can see how you'd do it that way and compare, etc.

functionviewXMLFiles() {
    // var everythingvar xmlhttp = newXMLHttpRequest(),
        xmlDoc,
        nodes, i, j, counter = -1, suffix,
        document_name, file_type, file_location;
    // request page
    xmlhttp.open("GET", "TestInfo.xml", false),
    xmlhttp.send();
    // false meant synchronous req. so can go straight to reading document
    xmlDoc = xmlhttp.responseXML;
    // loop over <document> nodes
    nodes = xmlDoc.childNodes; // shorthand
    j = nodes.length;
    for (i = 0; i < j; ++i) {
        if ('document' === nodes[i].tagName.toLowerCase()) {
            // nodes[i] is a <document>, increment counter
            ++counter;
            // get nodes of intrest
            document_name = nodes[i].getElementsByTagName("document_name")[0];
            file_type = nodes[i].getElementsByTagName("file_type")[0];
            file_location = nodes[i].getElementsByTagName("file_location")[0];

            // do what you want with these, e.g.
            suffix = counter || ''; // don't append a number for 0document.getElementById('docname'+suffix).textContent = document_name.textContent;
            document.getElementById('filetype'+suffix).textContent = file_type.textContent;
            document.getElementById('fileloc'+suffix).textContent = pathToRoot + "/" + file_location.textContent;
        }
    }
}

Furthermore, you should consider the validity of your HTML, as I mentioned in my comment;

  • there should be no spaces around the equals sign of an attribute name/value pair, i.e. <tag attrib="val"/>not<tag attrib = "val"/>
  • every id attribute should have a unique value, not shared with any other on the document, i.e. not<tag id="shared"/><tag id="shared"/>

Post a Comment for "Loop Through Xml Parser?"