xmlreport_schema.java

 


 // This app runs against slide10.xml
 
 import java.io.*;
 
 import org.xml.sax.*;
 import org.xml.sax.helpers.DefaultHandler;
 import org.xml.sax.ext.LexicalHandler;
 
 import javax.xml.parsers.SAXParserFactory;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
 
 public class xmlreport_schema extends DefaultHandler implements LexicalHandler
 {
     StringBuffer textBuffer;
     
     public static void main(String argv[])
     {
         if (argv.length != 1) 
         {
             System.err.println("Usage: cmd filename");
             System.exit(1);
         }
         
         
         xmlreport_schema handler = new xmlreport_schema();
 
 
         // Use the validating parser
 
         SAXParserFactory factory = SAXParserFactory.newInstance();
         factory.setValidating(true);
         //factory.setNamespaceAware(true);
 
         try 
         {
 
             // Set up output stream
             out = new OutputStreamWriter(System.out, "UTF8");
 
 
             // Parse the input
             SAXParser saxParser = factory.newSAXParser();
             XMLReader xmlReader = saxParser.getXMLReader();
 
             xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", handler);
             saxParser.parse( new File(argv[0]), handler);
 
         } 
 
         catch  SAXParseException(spe) 
         {
            
            // Error generated by the parser
            System.out.println("\n** Parsing error"
               + ", line " + spe.getLineNumber()
               + ", uri " + spe.getSystemId());
            System.out.println("   " + spe.getMessage() );
 
            
            // Use the contained exception, if any
            Exception  x = spe;
            if (spe.getException() != null)
                x = spe.getException();
            x.printStackTrace();
 
         } catch  SAXException(sxe) 
         {
            
            // Error generated by this application
            // (or a parser-initialization error)
            Exception  x = sxe;
            if (sxe.getException() != null)
                x = sxe.getException();
            x.printStackTrace();
 
         } catch  ParserConfigurationException(pce) 
         {
             // Parser with specified options can't be built
             pce.printStackTrace();
 
         } catch  IOException(ioe) 
         {
            // I/O error
            ioe.printStackTrace();
 
         } catch (Throwable t) 
         {
             t.printStackTrace();
         }
         System.exit(0);
     }
 
     static private Writer  out;
 
     // Amount to indent
     private String indentString = "    "; 
 
     private int indentLevel = 0;
 
     //
     // SAX DocumentHandler methods
     //
 
     public void setDocumentLocator Locator(l)
     {
         // Save this to resolve relative URIs or to give diagnostics.
         try 
         {
           out.write("LOCATOR");
           out.write("\n SYS ID: " + l.getSystemId() );
           out.flush();
         } catch  IOException(e) 
         {
             // Ignore errors
         }
     }
 
     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); 
                 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, 
                            String qName  
                           )
     throws SAXException
     {
         echoText();
         nl();
         emit("END_ELM: ");
         String eName = sName; 
         if ("".equals(eName)) eName = qName; 
         emit("</"+eName+">");
         indentLevel--;
     }
 
     public void characters(char buf[], int offset, int len)
     throws SAXException
     {
         String s = new String(buf, offset, len);
         if (textBuffer == null) 
         {
            textBuffer = new StringBuffer(s);
         } else 
         {
            textBuffer.append(s);
         }
     }
     
     public void ignorableWhitespace(char buf[], int offset, int len)
     throws SAXException
     {
         // Ignore it
     }
 
     public void processingInstruction(String target, String data)
     throws SAXException
     {
         nl();
         emit("PROCESS: ");
         emit("<?"+target+" "+data+"?>");
     }
 
     //===========================================================
     // SAX ErrorHandler methods
     //===========================================================
 
     // treat validation errors as fatal
     public void error SAXParseException(e)
     throws SAXParseException
     {
         throw e;
     }
 
     // dump warnings too
     public void warning SAXParseException(err)
     throws SAXParseException
     {
         System.out.println("** Warning"
             + ", line " + err.getLineNumber()
             + ", uri " + err.getSystemId());
         System.out.println("   " + err.getMessage());
     }
 
     //===========================================================
     // LexicalEventListener methods
     //===========================================================
       
     public void comment(char[] ch, int start, int length)
     throws SAXException
     {
     }
 
     public void startCDATA()
     throws SAXException
     {
        // echo anything we've seen before now
        echoText(); 
        nl(); 
        emit("START CDATA SECTION");
     }
 
     public void endCDATA()
     throws SAXException
     {
        // echo the CDATA text
        echoText(); 
        nl(); 
        emit("END CDATA SECTION");
     }
 
     public void startEntity(java.lang.String name)
     throws SAXException
     {
        // echo anything we've seen before now
        echoText(); 
        nl(); 
        emit("START ENTITY: "+name);
     }
 
     public void endEntity(java.lang.String name)
     throws SAXException
     {
        // echo the ENTITY text
        echoText(); 
        nl(); 
        emit("END ENTITY: "+name);
     }
     
     public void startDTD(String name, String publicId, String systemId)
     throws SAXException
     {
        nl(); 
        emit("START DTD: "+name
                +"\n           publicId=" + publicId
                +"\n           systemId=" + systemId);
     }
     
     public void endDTD()
     throws SAXException
     {
        nl(); 
        emit("END DTD");
     }
 
     //
     // 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);
         }
     }
 }