xmlreport.java
import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; public class xmlreport extends DefaultHandler { StringBuffer textBuffer; public static void main String(argv[]) { if (argv.length != 1) { System.err.println("Usage: cmd filename"); System.exit(1); } // Use an instance of ourselves as the SAX event handler DefaultHandler handler = new xmlreport(); // Use the default (non-validating) parser SAXParserFactory factory = SAXParserFactory.newInstance(); try { // Set up output stream out = new OutputStreamWriter(System.out, "UTF8"); // Parse the input SAXParser saxParser = factory.newSAXParser(); saxParser.parse( new File(argv[0]), handler); } catch (Throwable t) { t.printStackTrace(); } System.exit(0); } static private Writer out; private String indentString = " "; // Amount to indent private int indentLevel = 0; //=========================================================== // SAX DocumentHandler methods //=========================================================== public void startDocument() throws SAXException { nl(); nl(); emit("START DOCUMENT"); nl(); emit("<?xml version='1.0' encoding='UTF-8'?>"); } public void endDocument() throws SAXException { nl(); emit("END DOCUMENT"); try { nl(); out.flush(); } catch IOException(e) { throw new SAXException("I/O error", e); } } public void startElement String(namespaceURI, String sName, // simple name String qName, // qualified name Attributes attrs) throws SAXException { echoText(); indentLevel++; nl(); emit("ELEMENT: "); String eName = sName; // element name if ("".equals(eName)) eName = qName; // not namespaceAware emit("<"+eName); if (attrs != null) { for (int i = 0; i < attrs.getLength(); i++) { String aName = attrs.getLocalName(i); // Attr name if ("".equals(aName)) aName = attrs.getQName(i); nl(); emit(" ATTR: "); emit(aName); emit("\t\""); emit(attrs.getValue(i)); emit("\""); } } if (attrs.getLength() > 0) nl(); emit(">"); } public void endElement String(namespaceURI, String sName, // simple name String qName // qualified name ) throws SAXException { echoText(); nl(); emit("END_ELM: "); String eName = sName; // element name if ("".equals(eName)) eName = qName; // not namespaceAware emit("</"+eName+">"); indentLevel--; } public void characters(char buf[], int offset, int len) throws SAXException { if (textBuffer != null) { echoText(); textBuffer = null; } String s = new String(buf, offset, len); if (textBuffer == null) { textBuffer = new StringBuffer(s); } else { textBuffer.append(s); } } //=========================================================== // Utility Methods ... //=========================================================== // Display text accumulated in the character buffer private void echoText() throws SAXException { if (textBuffer == null) return; nl(); emit("CHARS: "); String s = ""+textBuffer; if (!s.trim().equals("")) emit(s); textBuffer = null; } // Wrap I/O exceptions in SAX exceptions, to // suit handler signature requirements private void emit String(s) throws SAXException { try { out.write(s); out.flush(); } catch IOException(e) { throw new SAXException("I/O error", e); } } // Start a new line // and indent the next line appropriately private void nl() throws SAXException { String lineEnd = System.getProperty("line.separator"); try { out.write(lineEnd); for (int i=0; i < indentLevel; i++) out.write(indentString); } catch IOException(e) { throw new SAXException("I/O error", e); } } }