<HTML>
<HEAD>
<TITLE>XML to DOM Converter: Listing 1</TITLE>
<APPLET CODE=com.ms.xml.dso.XMLDSO.class WIDTH=100% HEIGHT=30 ID=xmldso MAYSCRIPT=true>
<PARAM NAME="url" VALUE="someXMLDocument.xml">
</APPLET>
</HEAD>
<BODY>

<SCRIPT>
_root = xmldso.getDocument().root
results = window.document;


// Simple stack ADT
function stack()
{
	this.depth = 0;
	this.data = new Array();
	this.push = push;
	this.pop = pop;
	this.popTop = popTop;
	this.length = length;
	this.exists = exists;
	return this;
}

// Add an item
function push( item )
{
	this.data[ this.depth ++ ] = item;
}

// Remove last item
function pop()
{
	if ( this.depth )
	{
		this.depth --;
		return this.data[ this.depth ];
	}

	return null;
}

// Remove item at head of stack
function popTop()
{
	if ( this.depth )
	{
		// Pop the top item
		_j = this.data[ 0 ];
		this.depth --;

		// Shuffle the stack up a place
		for ( _i = 0; _i < this.depth; _i ++ )
		{
			this.data[ _i ] = this.data[ _i + 1 ]
		}

		return _j;		
	}
	return null;
}

// Return the size of the stack
function length()
{
	return this.depth;
}

// Does the stack hold the specified item?
function exists( obj )
{
	for ( _i = 0; _i < this.depth; _i ++ )
	{
		if ( this.data[ _i ] == obj )
		{
			return true;
		}
	}
				
	return false;
}

// Get the XML root
var root = document.applets.xmldso.getDocument().root;
    
// Stack for XML elements
var x = new stack();
x.push( root );
	
while ( x.length() != 0 )
{
	// Pop top item
	var xmlTag = x.popTop();
		
	// If node is a leaf, write it out, else stack its children
	if ( xmlTag.children.length == 0 )
document.writeln( xmlTag.tagname + " : " + xmlTag.text 		
+ "<br>" );
	else	
	{
		for ( i = 0; i < xmlTag.children.length; i ++ )
			x.push( xmlTag.children.item( i ) );
	}		
}

</SCRIPT>

</BODY>
</HTML>