I’m working on a small xml/html interface to list a bunch of buttons, and I’m having an issue with what I think is it looking for item types in nodes it shouldn’t be.
The XML has a <set> of groups, and inside that will be <items> which has a <type>, a ‘button’ or ‘break’.
After a check if <type> is a ‘button’, it then loads the <name>, but it seems to be trying to load <name> on ‘break’ types as well?
$(document).ready(function(){
if (window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","list.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
var data_sets = xmlDoc.getElementsByTagName("set");
for (var i = 0; i < data_sets.length; i++) {
$("body").append('<div id="set'+i+'"> <h2>SetContent'+i+'</h2></div>');
for (var j = 0; j < data_sets[i].children.length; j++) {
var type = data_sets[i].getElementsByTagName("type")[j].childNodes[0].nodeValue;
if(type=="button"){
var name = "name";
name = data_sets[i].getElementsByTagName("name")[j].childNodes[0].nodeValue;
//commenting out this name line above seems to stop the crash?
$("#set"+i).append('<button type=button id="btn_'+i+'_'+j+'">'+name+'</button>');
}else if(type=="break"){
$("#set"+i).append('<br>');
}
}
}
});
And the XML:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<set name="Set A">
<item>
<type>button</type>
<name>btn 1 A</name>
<color>#ff00ff</color>
</item>
<item>
<type>button</type>
<name>btn 1 B</name>
<color>#ff00ff</color>
</item>
<item>
<type>break</type>
</item>
<item>
<type>button</type>
<name>btn 1 C</name>
<color>#ff00ff</color>
</item>
</set>
<set name="Set B">
<item>
<type>button</type>
<name>btn 2 A</name>
<color>#ff00ff</color>
</item>
<item>
<type>break</type>
</item>
<item>
<type>button</type>
<name>btn 2 B</name>
<color>#ff00ff</color>
</item>
<item>
<type>button</type>
<name>btn 2 C</name>
<color>#ff00ff</color>
</item>
</set>
</data>
Advertisement
Answer
You are looking up the jth type element, when you need ot llok up the jth item element.
It is a one line change, below:
$(document).ready(function(){
if (window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","list.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
var data_sets = xmlDoc.getElementsByTagName("set");
for (var i = 0; i < data_sets.length; i++) {
$("body").append('<div id="set'+i+'"> <h2>SetContent'+i+'</h2></div>');
for (var j = 0; j < data_sets[i].children.length; j++) {
var type = data_sets[i].getElementsByTagName("type")[j].childNodes[0].nodeValue;
if(type=="button"){
var name = "name";
//I have changed how you reference the name element
name = data_sets[i].getElementsByTagName("item")[j].getElementsByTagName("name")[0].childNodes[0].nodeValue
$("#set"+i).append('<button type=button id="btn_'+i+'_'+j+'">'+name+'</button>');
}else if(type=="break"){
$("#set"+i).append('<br>');
}
}
}
});
(and its a bit odd to have a variable named ‘type’, but that’s beside the point)