Jump to content

Parsing XML (button and search form)


BG29

Recommended Posts

Hi,I am not an IT guy (I am a paleontologist =) and my mother-tongue is not English. I have built few small websites: for instance, one for an open access scientific journal, that I am keeping on maintaining and upgrading. For some of them I have had the possibility to use PHP and MySQL (I manage to write .inc and .php files, but obviously it is not me but my IT colleagues at the University who take care of the server issues!). For other sites I can only use HTML (no PHP, no PERL, no ASP, ...). Therefore sometimes I have to manipulate a little javascript and when I combine pieces of code I get something that works and which is quite useful.Of course sometimes it isfrustrating to be unable to use a server-based database but it forces me to look for solutions elsewhere ... and actually it is fine to have tools and data which are not server-based, that is you can run from your PC (or Mac) or from a CD/DVD. The scientific journal I am publishing get a yearly DVD version and we use a very efficient JS search engine to explore it ("Tipue"). Recently I have build an XML (-like) file with some 7,500 entries. I used some pieces of scripts given in examples of the W3Schools and combine them in order to parse this flat database :1) to display some data corresponding to a certain id/an ordering number out of the 7,500 (display1: name, year, title), then by clicking on it getting a larger set of data for the same id (display2: name, year, title, reference, abstract, keywords);2) to browse up and down the entries, one after the other, with an increment of one, five or twenty, or to be able to go to a certain id by entering its id number in a form.This database will be used to document an open access web publication about FOSSIL corals and sponges (you can see that my fields of interests are quite far from programming!). This script I "built" WORKS on my PC with Firefox,http://paleopolis.re...rowse_test.htmlbut not with Chrome (nor Safari). Chrome gives me 4 errors but I am unable to understand them (it is Chinese to me). The file FCnP.xml is at the same level as the browse_test.html ...It also works on my spouse's Ipad! Is there anybody to help me? Here is the HTML code :

<!DOCTYPE html><html><head><script language="javascript1.3">if (window.XMLHttpRequest)  {// code for IE7+, Firefox, Chrome, Opera, Safari  xmlhttp=new XMLHttpRequest();  }else  {// code for IE6, IE5  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  }xmlhttp.open("GET","FCnP.xml",false);xmlhttp.send();xmlDoc=xmlhttp.responseXML;x=xmlDoc.getElementsByTagName("RECORD");i=0;function displayCD(){id=(x[i].getElementsByTagName("ID")[0].childNodes[0].nodeValue);artist=(x[i].getElementsByTagName("AUTHORS")[0].childNodes[0].nodeValue);year=(x[i].getElementsByTagName("YEAR")[0].childNodes[0].nodeValue);title=(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);txt= id + " - Author(s): " + artist + "<br>Year: "+ year + "<br>Title: " + title;document.getElementById("showCD").innerHTML=txt;}function displayCDInfo(){artist=(x[i].getElementsByTagName("AUTHORS")[0].childNodes[0].nodeValue);year=(x[i].getElementsByTagName("YEAR")[0].childNodes[0].nodeValue);title=(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);source=(x[i].getElementsByTagName("SOURCE")[0].childNodes[0].nodeValue);abstr=(x[i].getElementsByTagName("ABSTRACT")[0].childNodes[0].nodeValue);fcnp=(x[i].getElementsByTagName("FCnP")[0].childNodes[0].nodeValue);subject=(x[i].getElementsByTagName("SUBJECT")[0].childNodes[0].nodeValue);syst=(x[i].getElementsByTagName("SYST")[0].childNodes[0].nodeValue);strat=(x[i].getElementsByTagName("STRAT")[0].childNodes[0].nodeValue);geog=(x[i].getElementsByTagName("GEOG")[0].childNodes[0].nodeValue);txt= artist + " (<b>" + year + "</b>).- " + title + "- " + source + " - <b>FC&P:</b> " + fcnp + "<br><b>Abstract:</b> " + abstr + "<br>Topic(s): " + subject + "<br>Systematics: " + syst + "<br>Stratigraphy: " + strat + "<br>Geography: " + geog;document.getElementById("showCD").innerHTML=txt;}function next(){if (i<x.length-1)  {  i++;  displayCD();  }}function previous(){if (i>0)  {  i--;  displayCD();  }}function next5(){if (i<x.length-1)  {  i+=5;  displayCD();  }}function previous5(){if (i>5)  {  i-=5;  displayCD();  }}function next20(){if (i<x.length-1)  {  i+=20;  displayCD();  }}function previous20(){if (i>20)  {  i-=20;  displayCD();  }}function goForit(){if (i<6708)  {  i=+this.document.testform.inputbox.value;  displayCD();  }}</script></head><body onload="displayCD()"><script language="javascript1.3">document.write("<p>");if (i==0)  {  document.write("<div id='showCD' onclick='displayCDInfo(" + i + ")'></div>");  }elsefor (i=1;i<x.length;i++)  {  document.write("<div id='showCD(" + i + ")' onclick='displayCDInfo(" + i + ")'></div>");  }document.write("</p>");</script><form name="testform"><input type="button" onclick="previous20()" value="-20" /><input type="button" onclick="previous5()" value="-5" /><input type="button" onclick="previous()" value="-1" /><input type="text" name="inputbox" value="" size="5"><input type="button" name="Enter" Value="Enter" onClick="goForit(this.form)"><input type="button" name="Reload" value="Reload" onClick="window.location.reload()"><input type="button" onclick="next()" value="+1" /><input type="button" onclick="next5()" value="+5" /><input type="button" onclick="next20()" value="+20" /></form></body></html>

It would be great (and acknowledged), if someone could provide us with solutions to these problems OR an alternative way to get the same (actually better) results.I believe that this simple assemblage of function could be very usefull for many colleagues of mine (paleontologists, ...). I thank you in advance for your time and consideration.=) BG

Edited by BG29
Link to comment
Share on other sites

I fixed it! I replaced

  document.write("<div id='showCD' onclick='displayCDInfo(" + i + ")'></div>");

with

document.write("<div id='showCD(" + i + ")' onclick='displayCDInfo(" + i + ")'></div>");

I know it is not elegant but it works. BUT --in any case -- should you have an alternative solution for the same result I would welcome it!... Best wishes,Bruno

Link to comment
Share on other sites

This script seems mostly unnecessary:

document.write("<p>");if (i==0)  {  document.write("<div id='showCD' onclick='displayCDInfo(" + i + ")'></div>");  }elsefor (var i=1;i<x.length;i++)  {  document.write("<div id='showCD(" + i + ")' onclick='displayCDInfo(" + i + ")'></div>");  }document.write("</p>");

For one thing, because of the way document.write() works, two paragraphs get created, not one. (One at the top, and another at the bottom.) And neither of them encloses the div. They just sit there, empty. Next, the variable i is assigned the value 0 when the document loads. So your else condition never exists. And even if it did, you'd end up with a bazillion empty divs that don't get used. Also, the displayCDInfo() function does not use any arguments. The value of i is tracked separately as a global, and displayCDInfo() accesses it internally. So there is no point in writing the value of i into the #showCD div. All of which means that you only need the first div, and you don't need to create it using document.write(). You should be able to replace your whole script with this:

<div id="showCD" onclick="displayCDInfo()"></div>

Or have I misunderstood something?

Edited by Deirdre's Dad
Link to comment
Share on other sites

likely you made an error. all you would have to do it just open up your console and look, the errors would be there.

Link to comment
Share on other sites

"hello"as I said earlier "my" poor code workshttp://paleopolis.rediris.es/cg/test/browse.html all the files are currently stored under http://paleopolis.rediris.es/cg/test/)it is not elegant but I get the result I expectedNOW if you have a better way to get the same result (cleaning the code, rewriting it from the beginning, ...) you are most welcome to let me knowYou have to remember that I made it to get a portable database and parser (I do not want to have to deal with a server-based database)Cheers,BG

Link to comment
Share on other sites

NOW if you have a better way to get the same result (cleaning the code, rewriting it from the beginning, ...) you are most welcome to let me know
I was merely suggesting that you fix the code you tried to change per the advice that DD gave you, not walk away from it. His suggestions were all valid I would advocate you try again, and let us help you when you have problems. It would be a good learning experience. Edited by thescientist
Link to comment
Share on other sites

That is right ... it works too.I have it working at http://paleopolis.re.../test/test.html I tried it before and it did not work (may be there was a typing mistake on my side) There are 6700 data in the database and when I try to add +20 or search for a higher number it gets stacked ... then using -20 several times depending on the value it works again Is there a way I can display that the serached number is exceeding the number of values recorded? with a if / else? Bruno

Edited by BG29
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...