import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


	import org.apache.xerces.parsers.DOMParser;

	/**
	 * XMLDOM przyjmuje ścieżkę dostępu do pliku XML, który parsuje
	 * za pomocą parsera DOM i wyświetla sparsowaną zawartość.   
	 *
	 * @author Wiesław Dudek
	 * @version 1.0
	 */
	public class XMLDOM {

	    /**
	     * Wykonywane jest parsowanie pliku i wyświetlanie zawartości.
	     * 
	     * @param xml String ścieżka dostępu do pliku XML.
	     */
	    public void parseIt(String xml) {
	        System.out.println("Parsowanie pliku XML: " + xml + "\n\n");

	        // ładujemy parser
	        DOMParser parser = new DOMParser();
	        try {
	        	//parsujemy dokument
	            parser.parse(xml);
	            
	            //pobieramy strukturę sparsowanego dokumentu
	            Document doc = parser.getDocument();

	            // wyświetamy dokument na podstawie struktury DOM
	            showNode(doc, "");
	            

	        } catch (Exception ex) {
	            ex.printStackTrace();
	            System.out.println("Błąd w parsowaniu: " + ex.getMessage());
	        }
	    }
	    
	    /**
	     * Wyświetlamy węzeł oraz jego podwęzły
	     *
	     * @param node Node węzeł do wyświetlenia.
	     * @param indent String wcięcie do wyświetlenia przed wyśw. węzła
	     */
	    public void showNode(Node node, String indent)  {
	    	
	        //akcja zależy od typu węzła
	        switch (node.getNodeType()) {
	            case Node.DOCUMENT_NODE:
	            	System.out.println("<xml version=\"1.0\" encoding=\"windows-1250\">\n");
	            	// wyswietlanie węzłów potomnych
	            	NodeList nodes = node.getChildNodes();
	            	if (nodes != null) {
	            		for (int i=0; i<nodes.getLength(); i++) {
	            			showNode(nodes.item(i), "");
	            		}
	            	}	            
	            	break;

	            case Node.ELEMENT_NODE:
	            	//nazwa węzła
	                String name = node.getNodeName();      
	   		     	System.out.print(indent + "<" + name);
	   		     	//wyświetlenie atrybutów węzła
	                NamedNodeMap attrs = node.getAttributes();
	                for (int i=0; i<attrs.getLength(); i++) {
	                    Node attr = attrs.item(i);
	                    System.out.print(" " + attr.getNodeName() +
	                                     "=\"" + attr.getNodeValue() +
	                                     "\"");
	                }
	                System.out.println(">");

			        //wyświetlanie węzłów potomnych
	                NodeList children = node.getChildNodes();
	                if (children != null) {
	                    for (int i=0; i<children.getLength(); i++) {
	                        showNode(children.item(i), indent + "  ");
	                    }
	                }

	                System.out.println(indent + "</" + name + ">");
	                break;

	            case Node.TEXT_NODE:
	            case Node.CDATA_SECTION_NODE:
	            	//wyświetlenie danych wewnętrznych węzła
	            	System.out.print(node.getNodeValue());
	                break;

	            case Node.PROCESSING_INSTRUCTION_NODE:
	            	//wyświetlenie instrukcji
	                System.out.println("<?" + node.getNodeName() +
                            " " + node.getNodeValue() +"?>");
	                break;

	            case Node.ENTITY_REFERENCE_NODE:
	            	// wyświetlenie encji np. &gt; == >
	                System.out.print("&" + node.getNodeName() + ";");	            	
	                break;

	            case Node.DOCUMENT_TYPE_NODE:
	            	// wyświetlenie DTD
	                DocumentType typeOfDoc = (DocumentType)node;
	                System.out.print("<!DOCTYPE " + typeOfDoc.getName());
	                if (typeOfDoc.getPublicId() != null)  {
	                    System.out.print(" PUBLIC \"" + typeOfDoc.getPublicId() + "\" ");
	                } else {
	                    System.out.print(" SYSTEM ");
	                }
	                System.out.println("\"" + typeOfDoc.getSystemId() + "\">");

	            	break;
	        }

	    }

	    /**
	     * wejście programu
	     */
	    public static void main(String[] args) {
	        if (args.length != 1) {
	            System.out.println("Użycie: java XMLDOM <ścieżka do pliku XML>");
	            System.exit(0);
	        }

	        String xml = args[0];

	        XMLDOM parserDemo = new XMLDOM();
	        parserDemo.parseIt(xml);
	    }

	}
