PDA

View Full Version : problems Parsing XML in javascript (esp. if empty nodes can show up)


arianhojat
08-02-2007, 07:15 PM
Hello All,
I just realized some xml nodes returned by my AJAX could be empty, and it will stop the script since there is no nodeValue in below script.
Any easier way to do this without checking each node...

I have to resort for each node to do an if else

if(
classes[i].getElementsByTagName('StartTime')[0]
&& classes[i].getElementsByTagName('StartTime')[0].firstChild
)

or alternatively:
if(
classes[i].getElementsByTagName('StartTime').length
&& classes[i].getElementsByTagName('StartTime')[0].firstChild
)

like this:

//AJAX onSuccess javascript function
function getClassesSuccess(transport)
{
var responseXML = transport.responseXML;

var classes = responseXML.getElementsByTagName('c');

if( classes[i].getElementsByTagName('StartTime').length && classes[i].getElementsByTagName('StartTime')[0].firstChild )
StartTime = classes[i].getElementsByTagName('StartTime')[0].firstChild.nodeValue;
else
StartTime = 'N/A';

if( classes[i].getElementsByTagName('EndTime').length && classes[i].getElementsByTagName('EndTime')[0].firstChild )
EndTime = classes[i].getElementsByTagName('EndTime')[0].firstChild.nodeValue;
else
EndTime = 'N/A';


document.getElementById('time').innerHtml=StartTime +' - '+EndTime;
}


//my simplified xml file
<root>
<c>
<StartTime/>
...
</c>
<c>
<StartTime>10:00pm</StartTime>
...
</c>
</root>

Bonker
08-03-2007, 11:11 AM
I think you will always have to check for empty elements unless you only include an element in your xml if it has a child text node. But you could do it a little more generic by using the asterix and a switch statement:


var List = responseXML.getElementsByTagName('*');
var i = List.length - 1;
for (; i > -1; i--) {
if (List[i].hasChildNodes()) {
// generic
var Val = List[i].firstChild.nodeValue;
// specific by tag name
switch (List[i].nodeName) {
case 'StartTime': var StartTime = List[i].firstChild.nodeValue; break;
case 'EndTime': var EndTime= List[i].firstChild.nodeValue; break;
}
}
}


BTW: You shouldn't give a variable name the same name as property:
// var responseXML = transport.responseXML;
var Res = transport.responseXML;
or maybe this was just for demonstration purpose?