import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

import org.xml.sax.* ;
import org.w3c.dom.* ;

public class MyProcessor {

    public static void main(String [] args) throws Exception {

        File source = new File(args [0]) ;

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

        DocumentBuilder builder = factory.newDocumentBuilder();
        builder.setErrorHandler(new MyErrorHandler()) ;
        Document document = builder.parse(source) ;

        process(document.getDocumentElement()) ;
    }

    static void process(Node node) {
        System.out.println(node.getNodeName()) ;
        switch(node.getNodeType()) {
            case Node.ELEMENT_NODE:
                NamedNodeMap attributes = node.getAttributes() ; 
                for(int i = 0 ; i < attributes.getLength() ; i++)
                    process(attributes.item(i)) ;
                NodeList children = node.getChildNodes() ; 
                for(int i = 0 ; i < children.getLength() ; i++)
                    process(children.item(i)) ;
                break ;
            case Node.TEXT_NODE:
            case Node.ATTRIBUTE_NODE:
                System.out.println(node.getNodeValue()) ;
        }
    }

}

class MyErrorHandler implements ErrorHandler {
    public void warning(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void error(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void fatalError(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
        System.exit(1) ;
    }
}