import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class SaxBeispiel{

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

    Parser parser = 
      ParserFactory.makeParser("org.apache.xerces.parsers.SAXParser");

    DocumentHandler docHandler = new MeinDocHandler();
    parser.setDocumentHandler(docHandler);

    ErrorHandler errorHandler = new MeinErrorHandler();
    parser.setErrorHandler(errorHandler);

    for (int i = 0; i < args.length; i++) {
      parser.parse(args[i]);
    }
  }
}

class MeinDocHandler implements DocumentHandler
{
  private Locator locator = null;

  public void startDocument ()
  {
    System.out.println("Parsen beginnt");
  }

  public void endDocument ()
  {
    System.out.println("Parsen beendet");
  }

  public void startElement (String name, AttributeList attrs)
  {
    int attLen = 0;
    System.out.print("<" + name);
    if (attrs != null && ((attLen = attrs.getLength()) > 0)) {
      for (int i = 0; i < attLen; i++) {
        System.out.print(" " + attrs.getName(i) + "='");
        System.out.print(attrs.getValue(i) + "'");
      }
    }
    System.out.print(">");
  }

  public void endElement (String name)
  {
    System.out.print("</" + name + ">");
  }

  public void characters (char ch[], int start, int length)
  {
    System.out.print("Characters:    \"");
    for (int i = start; i < start + length; i++) {
      switch (ch[i]) {
        case '\\':
                   System.out.print("\\\\");
                   break;
         case '"':
                   System.out.print("\\\"");
                   break;
         case '\n':
                   System.out.print("\\n");
                   break;
         case '\r':
                   System.out.print("\\r");
                   break;
         case '\t':
                   System.out.print("\\t");
                   break;
         default:
                   System.out.print(ch[i]);
                   break;
      }
    }
    System.out.print("\"\n");
  }

  public void ignorableWhitespace (char ch[], int start, int length)
  {
    System.out.println("Ignorable Whitespace gefunden!");
  }

  public void processingInstruction (String target, String data)
  {
    System.out.println("Processing Instruction gefunden!");
  }

  public void setDocumentLocator (Locator locator)
  {
    System.out.println("setDocumentLocator aufgerufen!");
    this.locator = locator;
  }

  private void printloc()
  {
    System.out.println("LocLine: " + locator.getLineNumber());
    System.out.println("LocCol : " + locator.getColumnNumber());
  }
}

class MeinErrorHandler implements ErrorHandler
{

  public void warning (SAXParseException exception)
  {
    print("Warning", exception);
  }

  public void error (SAXParseException exception)
  {
    print("Warning", exception);
  }

  public void fatalError (SAXParseException exception)
  {
    print("Warning", exception);

  }


  private void print(String label, SAXParseException e)
  {
     System.err.println("** Parser " + label + ": " +
                        e.getMessage());
     System.err.println("   Line:      " + e.getLineNumber());
     System.err.println("   Column:    " + e.getColumnNumber());
     System.err.println("   URI:       " + e.getSystemId());
     System.err.println("   PUBLIC id: " + e.getPublicId());
  }
}