<HTML>
<HEAD>
<TITLE>XML to DOM Converter  Listing 2</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;
}


// Cache the XML root
var root = document.applets.xmldso.getDocument().root;

// Holds XML node objects
var x = new stack();

// Holds incremental document description tags
var y = new stack();
	
x.push( root );
y.push( "document." + root.tagname + "." );

while ( x.length() != 0 )
{
	// Pop top items
	var xmlTag = x.popTop();
	var docTag = y.popTop();
	
	// If the XML node is a leaf, assign its DOM equivalent its 	
	// textual value; otherwise create a new DOM object 
	var docString = docTag.substring( 0, docTag.length - 1 ) + 
		" = ";
	
	// Write out a DOM representation
	if ( xmlTag.children.length != 0 )
		docString += "new " + xmlTag.tagname + "();<br>";
	else
		docString += "'" + xmlTag.text + "';<br>";
				
	window.document.writeln( docString );

	// Stack children of this XML node
	if ( xmlTag.children )
	{
		// Might seem logical to cache xmlTag.children, but if you 		
		// do XMLDSO won't work properly
		for ( i = 0; i < xmlTag.children.length; i ++ )
		{
			x.push( xmlTag.children.item( i ) );
			
			// How many instances of a given child node at this 
			// level?
			var numInstances = -1;
				
			for ( j = 0; j < xmlTag.children.length; j ++ )
			{
				if ( xmlTag.children.item( i ).tagName ==
				xmlTag.children.item( j ).tagName )
						numInstances ++;
			}
				
			// Get instance index for current node
			var thisInstance = -1;
	
			for ( j = 0; j < i + 1; j ++ )
			{
				if ( xmlTag.children.item( j ).tagname == 
				xmlTag.children.item( i ).tagname )
						thisInstance ++;
			}

			if ( numInstances > 1 )
			{
y.push( docTag + xmlTag.children.item( i )
  .tagname + "[ " + thisInstance + " ]." );
			}	
			else
			{
y.push( docTag + xmlTag.children.item( i )
  .tagname + "." );
			}
		}
	}
}

</SCRIPT>

</BODY>
</HTML>