A sample of the XML file:
<?xml version="1.0" encoding="ISO-8859-1"?>
<mycds>
<cd>
<title>Wolf City</title>
<artist>Amon Duul II</artist>
<artist_id>1</artist_id>
<sequence>1</sequence>
<track_name> Surrounded By The Stars</track_name>
<track_id>2</track_id>
<sequence>2</sequence>
<track_name> Green Bubble Raincoated Man</track_name>
<track_id>3</track_id>
<sequence>3</sequence>
<track_name> Jail-House-Frog</track_name>
<track_id>4</track_id>
<sequence>4</sequence>
<track_name> Wolf City</track_name>
<track_id>5</track_id>
<sequence>5</sequence>
<track_name> Wie Der Wind Am Ende Einer Strabe</track_name>
<track_id>6</track_id>
<sequence>6</sequence>
<track_name> Deutsch Nepal</track_name>
<track_id>7</track_id>
<sequence>7</sequence>
<track_name> Sleepwalker's Timeless Bridge</track_name>
</cd>
</mycds>
I get the sequence and tracks with code like this:
var x=xmlDoc.getElementsByTagName("cd");
function show(i)
{
for (j=0; j < tracks.length; j++)
{
sequence = x[i].getElementsByTagName("sequence")
[j].childNodes[0].nodeValue;
.
.
.
}
}
But that produces the error:
Error: x[i].getElementsByTagName("sequence")[j] is undefined
Note: var i is successfully passed in.
As mentioned, the code works - but throws an error.
Can someone shed some light on why this might be getting the error,
and how to 'correct' it?
Sorry. I missed the first track:
<track_id>1</track_id>
Where is the declaration of `tracks'? It would better if you posted a
simple test case with minimalistic data and the relevant code instead
of snipping out parts from it. Use firebug to test your application
and inspect the program values at runtime. Most probably, a particular
combination of i and j is non-existent and hence the error. A simple
example like this should do the trick:
<code>//untested
var cds = doc.getElementsByTagName("cds");
if(!cds) return;
for(var i = 0, maxI = cds.length; i < maxI; ++i) {
var cd = cds[i];
// grab the title, artist, artist id
var seqs = cd.getElementsByTagName("sequence");
var tracks = cd.getElementsByTagName("track_name");
for(var j = 0, maxJ = seqs.length; j < maxJ; ++j) {
var seq = seqs[j].firstChild.nodeValue;
var trackName = tracks[j].firstChild.nodeValue;
// grab hold of track_id in the same way
}
}
</code>
/sasuke
I should know better. Here is a 'working' script, but still throws an
error. The xml file is as above:
<code>
<html>
<head>
<script type="text/javascript">
var xmlDoc;
if (window.ActiveXObject)
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
else if (document.implementation.createDocument)
{
xmlDoc=document.implementation.createDocument("","",null);
}
else
{
alert('Your browser cannot handle this script');
}
xmlDoc.async=false;
xmlDoc.load("mycd.xml");
var x=xmlDoc.getElementsByTagName("cd");
function show(i)
{
var txt="";
var artist=(x[i].getElementsByTagName("artist")
[0].childNodes[0].nodeValue);
var title=(x[i].getElementsByTagName("title")
[0].childNodes[0].nodeValue);
var tracks=xmlDoc.getElementsByTagName("track_name")
[0].childNodes[0].nodeValue;
var txt="Artist: "+artist+"<br />Title: "+title+"<br />";
var sequence ="";
for (j=0; j < tracks.length; j++)
{
var sequence = x[i].getElementsByTagName("sequence")
[j].childNodes[0].nodeValue;
var track_name=x[i].getElementsByTagName("track_name")
[j].childNodes[0].nodeValue;
txt=txt+"[" + sequence + "] " + track_name + "<br />";
document.getElementById("show").innerHTML=txt;
}
}
</script>
</head>
<body>
<script type="text/javascript">
document.write("<table border='1'>");
document.write("<tr>");
document.write("<td align='center'>Disk Number</td>");//
document.write("<td align='center'>Artist</td>");
document.write("<td align='center'>Title</td>");
document.write("</tr>");
for (var i=0;i<x.length;i++)
{
document.write("<tr onclick='show(" + i + ");'>");
document.write("<td>");
document.write(x[i].getElementsByTagName("cd_id")
[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("<td>");
document.write(x[i].getElementsByTagName("artist")
[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("<td>");
document.write(x[i].getElementsByTagName("title")
[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("</tr>");
}
document.write("</table>");
</script>
<div id='show'>
Click on one of the table rows to display the full album information.
</div>
</body>
</html>
</code>
The offending piece of code here is the declaration and definition of
`tracks'. Most probably a classic example of copy-paste-errors; it it
currently assigning the name of the first track to `tracks' instead of
an HTMLCollection.
Replace:
var tracks=xmlDoc.getElementsByTagName("track_name")[0].
childNodes[0].nodeValue; // 'surrounded by the stars'
with:
var tracks=xmlDoc.getElementsByTagName("track_name");
HTH,
/sasuke
With Firebug installed, the script does not display correctly. Firebug
and error console say I don't have permission to call method
Element.getElementsByTagName !? No line # is indicated.
-----------------------------------D<--------------------------------
<html>
<head>
<script type="text/javascript">
var xmlDoc;
if (window.ActiveXObject)
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
else if (document.implementation.createDocument)
{
xmlDoc=document.implementation.createDocument("","",null);
}
else
{
alert('Your browser cannot handle this script');
}
xmlDoc.async=false;
xmlDoc.load("mycd.xml");
var x=xmlDoc.getElementsByTagName("cd");
function show(i)
{
var txt="";
var artist=(x[i].getElementsByTagName("artist")
[0].childNodes[0].nodeValue);
var title=(x[i].getElementsByTagName("title")
[0].childNodes[0].nodeValue);
var tracks=xmlDoc.getElementsByTagName("track_name");
var txt="Artist: "+artist+"<br />Title: "+title+"<br />";
var sequence ="";
for (var j=0; j < tracks.length; j++)
<?xml version="1.0"?>
<mycds>
<cd>
<cd_id>1</cd_id>
<title>Wolf City</title>
<artist>Amon Duul II</artist>
<artist_id>1</artist_id>
<track_id>1</track_id>
<sequence>1</sequence>
<track_name> Surrounded By The Stars</track_name>
<track_id>2</track_id>
<sequence>2</sequence>
<track_name> Green Bubble Raincoated Man</track_name>
<track_id>3</track_id>
<sequence>3</sequence>
<track_name> Jail-House-Frog</track_name>
<track_id>4</track_id>
<sequence>4</sequence>
<track_name> Wolf City</track_name>
<track_id>5</track_id>
<sequence>5</sequence>
<track_name> Wie Der Wind Am Ende Einer Strabe</track_name>
<track_id>6</track_id>
<sequence>6</sequence>
<track_name> Deutsch Nepal</track_name>
<track_id>7</track_id>
<sequence>7</sequence>
<track_name> Sleepwalker's Timeless Bridge</track_name>
</cd>
</mycds>
-----------------------------------D<--------------------------------
/sasuke
.right_pane
{
border:solid 2px black;
background-color:#2DE51F;
color:black;
font-family:verdana;
width:49%;
float:right;
}
</style>
<script type="text/javascript">
var xmlDoc;
if (window.ActiveXObject)
{// code for IE
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
}
else if (document.implementation.createDocument)
{// code for Mozilla, Firefox, Opera, etc.
xmlDoc=document.implementation.createDocument("","",null);
}
else
{
alert('Your browser cannot handle this script');
}
xmlDoc.async=false;
xmlDoc.load("mycd.xml");
var x=xmlDoc.getElementsByTagName("cd");
var root = xmlDoc.documentElement;
var tracks=xmlDoc.getElementsByTagName("track_name");
var cds=xmlDoc.getElementsByTagName("cd");
var all = xmlDoc.getElementsByTagName("*");
//alert ('there are ' + x.length + ' cds');
//alert ('there are ' + tracks.length + ' tracks');
//alert ('there are ' + all.length + ' tags in total');
function show(i)
{
var txt="";
var disk = (x[i].getElementsByTagName("cd_id")
[0].childNodes[0].nodeValue);
var artist=(x[i].getElementsByTagName("artist")
[0].childNodes[0].nodeValue);
var title=(x[i].getElementsByTagName("title")
[0].childNodes[0].nodeValue);
var year=(x[i].getElementsByTagName("year")
[0].childNodes[0].nodeValue);
var country=(x[i].getElementsByTagName("country")
[0].childNodes[0].nodeValue);
var company=(x[i].getElementsByTagName("company")
[0].childNodes[0].nodeValue);
var price=(x[i].getElementsByTagName("price")
[0].childNodes[0].nodeValue);
var this_tracks=x[i].getElementsByTagName("track_name");
//alert('there are ' + this_tracks.length + ' tracks on this cd.');
var txt="Artist: "+artist+"<br />Title: "+title+"<br />Year: "+year
+"<br />Country: "+country+"<br />Company: "+company+"<br />Price:
"+price + "<br />";
for (var j=0; j < this_tracks.length; j++)
{
var sequence = x[i].getElementsByTagName("sequence")
[j].childNodes[0].nodeValue; /* THIS WORKS */
var track_name=x[i].getElementsByTagName("track_name")
[j].childNodes[0].nodeValue; /* THIS WORKS */
txt=txt+"[" + sequence + "] " + track_name + "<br />";
document.getElementById("show").innerHTML=txt;
}
}
</script>
</head>
<body>
<div class="left_pane">
<script type="text/javascript">
document.write("<table border='1'>");
document.write("<tr>");
document.write("<td align='center'>Disk Number</td>");//
document.write("<td align='center'>Artist</td>");
document.write("<td align='center'>Title</td>");
document.write("</tr>");
for (var i=0;i<x.length;i++)
{
document.write("<tr onclick='show(" + i + ");'>");
document.write("<td>");
document.write(x[i].getElementsByTagName("cd_id")
[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("<td>");
document.write(x[i].getElementsByTagName("artist")
[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("<td>");
document.write(x[i].getElementsByTagName("title")
[0].childNodes[0].nodeValue);
document.write("</td>");
document.write("</tr>");
}
document.write("</table>");
</script>
</div>
<div class="right_pane">
<div id='show'>
Click on one of the table rows to display the full album information.
</div>
</div>
</body>
</html>
8X------------------------- cut here -------------------------- 8X
The XML file:
8X------------------------- cut here -------------------------- 8X
<?xml version="1.0" encoding="ISO-8859-1"?>
<mycds>
<cd>
<cd_id>1</cd_id>
<title>Amon Duul II. Best of 1969 - 1974</title>
<artist>Amon Duul II</artist>
<artist_id>1</artist_id>
<year>1974</year>
<price>$11.05</price>
<company>Muffin' Man Musique</company>
<country>Canada eh!</country>
<track_id>1</track_id>
<track_name>Wie Der Wind Am Ende Einer Strasse</track_name>
<sequence>1</sequence>
<track_id>2</track_id>
<track_name>Archangel Thunderbird</track_name>
<sequence>2</sequence>
<track_id>3</track_id>
<track_name>Deutsch Nepal</track_name>
<sequence>3</sequence>
<track_id>4</track_id>
<track_name>Kannan</track_name>
<sequence>4</sequence>
<track_id>5</track_id>
<track_name>Surrounded By The Stars</track_name>
<sequence>5</sequence>
<track_id>6</track_id>
<track_name>Improvisations</track_name>
<sequence>6</sequence>
<track_id>7</track_id>
<track_name>Soap Shop Rock</track_name>
<sequence>7</sequence>
<track_id>8</track_id>
<track_name>Wolf City</track_name>
<sequence>8</sequence>
<track_id>9</track_id>
<track_name>Cerebrus</track_name>
<sequence>9</sequence>
<track_id>10</track_id>
<track_name>Henriette Krotenschwantze</track_name>
<sequence>10</sequence>
<track_id>11</track_id>
<track_name>Race From Here To Your Ears</track_name>
<sequence>11</sequence>
<track_id>12</track_id>
<track_name>Krohwinkl 12</track_name>
<sequence>12</sequence>
<track_id>13</track_id>
<track_name>Utopia No 1</track_name>
<sequence>13</sequence>
<track_id>14</track_id>
<track_name>Stumbling Over Melted Moonlight</track_name>
<sequence>14</sequence>
<track_id>15</track_id>
<track_name>A Morning Excuse</track_name>
<sequence>15</sequence>
<track_id>16</track_id>
<track_name>A Short Stop At The Trans-Sylvanian Brain-Surgery</
track_name>
<sequence>16</sequence>
<track_id>17</track_id>
<track_name>Pale Gallery</track_name>
<sequence>17</sequence>
</cd>
<cd>
<cd_id>2</cd_id>
<title>Wolf City</title>
<artist>Amon Duul II</artist>
<artist_id>1</artist_id>
<year>1968</year>
<price>$15.95</price>
<company>Muffin' Man Musique</company>
<country>Canada eh!</country>
<track_id>1</track_id>
<sequence>1</sequence>
<track_name> Surrounded By The Stars</track_name>
<track_id>2</track_id>
<sequence>2</sequence>
<track_name> Green Bubble Raincoated Man</track_name>
<track_id>3</track_id>
<sequence>3</sequence>
<track_name> Jail-House-Frog</track_name>
<track_id>4</track_id>
<sequence>4</sequence>
<track_name> Wolf City</track_name>
<track_id>5</track_id>
<sequence>5</sequence>
<track_name> Wie Der Wind Am Ende Einer Strabe</track_name>
<track_id>6</track_id>
<sequence>6</sequence>
<track_name> Deutsch Nepal</track_name>
<track_id>7</track_id>
<sequence>7</sequence>
<track_name> Sleepwalker's Timeless Bridge</track_name>
</cd>
<cd>
<cd_id>3</cd_id>
<title>Burgers</title>
<artist>Hot Tuna</artist>
<artist_id>3></artist_id>
<year>1968</year>
<price>$45.99</price>
<company>Muffin' Man Musique</company>
<country>Canada eh!</country>
<track_name>True Religion</track_name>
<track_id>1</track_id>
<sequence>1</sequence>
<track_name>Highway Song</track_name>
<track_id>2</track_id>
<sequence>2</sequence>
<track_name>99 Year Blues</track_name>
<track_id>3</track_id>
<sequence>3</sequence>
<track_name>Sea Child</track_name>
<track_id>4</track_id>
<sequence>4</sequence>
<track_name>Keep on Truckin'</track_name>
<track_id>5</track_id>
<sequence>5</sequence>
<track_name>Water Song</track_name>
<track_id>6</track_id>
<sequence>6</sequence>
<track_name>Ode for Billie Dean</track_name>
<track_id>7</track_id>
<sequence>7</sequence>
<track_name>Let Us Get Together Right Down Here</track_name>
<track_id>8</track_id>
<sequence>8</sequence>
<track_name>Sunny Day Strut</track_name>
<track_id>9</track_id>
<sequence>9</sequence>
</cd>
</mycds>
8X------------------------- cut here -------------------------- 8X