0

this is my first question on stack overflow, I hope you guys can help me.

here is my xml

<?xml version="1.0"?>
<RecentPhotoUploads>
<PHOTO><SOURCE>6171.jpg</SOURCE></PHOTO>
<PHOTO><SOURCE>6173.jpg</SOURCE></PHOTO>
<PHOTO><SOURCE>6895.jpg</SOURCE></PHOTO>
<PHOTO><SOURCE>Tulips.jpg</SOURCE></PHOTO>
</RecentPhotoUploads>

here is my javascript code

    var xml=loadXMLDoc("../upload.xml");
    var source="/RecentPhotoUploads/PHOTO/SOURCE"

    var nodes=xml.evaluate(source, xml, null, XPathResult.ANY_TYPE, null);
    var result=nodes.iterateNext();


                while (result)
                {
                document.write("<h2>" + result.childNodes[0].nodeValue + "</h2>");
                document.write("<a href='../pics/" + result.childNodes[0].nodeValue + "</a>");
                result=nodes.iterateNext();
                }

How would I loop through this xpathresult backwards?

Ashish Ahuja
  • 4,798
  • 9
  • 48
  • 63

3 Answers3

2

Why you would navigate backwards? You can just print backwards ...

var xml=loadXMLDoc("../upload.xml");
var source="/RecentPhotoUploads/PHOTO/SOURCE"

var nodes=xml.evaluate(source, xml, null, XPathResult.ANY_TYPE, null);
var result=nodes.iterateNext();

var buffer = "";
while (result) {
    buffer = "<h2>" + result.childNodes[0].nodeValue + "</h2>"
           + "<a href='../pics/" + result.childNodes[0].nodeValue + "'>"
           + result.childNodes[0].nodeValue + "</a>"
           + buffer;
    result=nodes.iterateNext();
}
document.write(buffer);

without resorting to documentFragment and similar modern tools ;)

Eineki
  • 14,008
  • 6
  • 47
  • 54
  • Great idea! You might want to use a StringBuilder object with your methodology to do the pre-pending, as described here: http://stackoverflow.com/questions/738950/c-sharp-or-java-prepend-strings-with-stringbuilder – M3NTA7 Sep 06 '12 at 23:50
  • 1
    @M3NTA7: I don't think javascript has a StringBuilder object – Eineki Sep 06 '12 at 23:53
  • Javascript's way is to simply `unshift()` into an array and then `join()` it. – slebetman Sep 07 '12 at 02:12
  • Sorry about the StringBuilder comment. I totally missed that it was javascript. – M3NTA7 Sep 10 '12 at 18:09
0

Here's an article that shows one way of sorting and iterating:

http://blogs.msdn.com/b/kaevans/archive/2006/04/17/577456.aspx

M3NTA7
  • 1,215
  • 1
  • 13
  • 22
0

First change the settings for your XPathResult. You want an ordered snapshot type. iterateNext() won't work because it doesn't have numeric keys.

var result = document.evaluate(source, xml, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

Then loop backwards like so.

for (var i = result.snapshotLength - 1; i >= 0; i--){
    document.write("<h2>" + result.snapshotItem(i).textContent + "</h2>");
    document.write("<a href='../pics/" + result.snapshotItem(i).textContent + "'>" 
    + result.snapshotItem(i).textContent + "</a>");

}

PS: you're missing a '>' in your code for the <a> tag. Not sure what output you're aiming for so I took a guess.

Mike Girard
  • 414
  • 3
  • 18