import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Hashtable;
import java.io.File;

import org.w3c.dom.CDATASection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
import org.xml.sax.ErrorHandler;


public class LeXML {

	private static int recuo = 0;


	private static final String JAXP_SCHEMA_LANGUAGE =
    "http://java.sun.com/xml/jaxp/properties/schemaLanguage";

	private static final String W3C_XML_SCHEMA =
    "http://www.w3.org/2001/XMLSchema";
 


    static public void main(String[] argv) {


		try
		{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setNamespaceAware(true);
			factory.setValidating(true);

			factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);

			DocumentBuilder builder = factory.newDocumentBuilder();
			builder.setErrorHandler(new Manipulador());

			File xml = new File(argv[0]);

			meuParse(builder.parse(xml).getDocumentElement());

		}

		catch (SAXException sx) {sx.printStackTrace(); }
		catch (ParserConfigurationException pc) {pc.printStackTrace(); }

		catch (Exception e)	{e.printStackTrace();	}
	}

	private static void meuParse(Node no) throws Exception {

		NodeList nos = no.getChildNodes();
		Node n;	

		for (int i = 0; i< nos.getLength() ; i++ )
		{
			n = nos.item(i);

			StringBuffer recuoS = new StringBuffer();
			
			for (int w = 0 ; w < recuo ; w++ )
			{
				recuoS.append(" ");
			}

			System.out.println(recuoS + "Localnome = " + n.getLocalName() );
			System.out.println(recuoS + " node type = " + n.getNodeType() );
			System.out.println(recuoS + " node name = " + n.getNodeName().trim() );
			System.out.println(recuoS + " parent = " + n.getParentNode().getNodeName() );

			if ( n.getNodeValue() != null)
			{
				System.out.println(recuoS + " valor = " + n.getNodeValue().trim());
			}


			if ( n.getNamespaceURI() != null)
			{
				System.out.println(recuoS + " namespace = " + n.getNamespaceURI().trim());
			}
			System.out.println("");

			recuo++;
			meuParse(n);

		}

		recuo--;

	}
}