
/**
Einfacher MathML-Parser mit prefix- und postfix Ausgabe.
Copyright (C) 2006, Rene Heuer, Salingtwiete 4g. (D)20535 Hamburg
eMail: heuer@exmpl.de
Dieses Programm ist freie Software. Sie können es unter den Bedingungen der
GNU General Public License, wie von der Free Software Foundation veröffentlicht,
weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder
(nach Ihrer Option) jeder späteren Version.
Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von
Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite
Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK.
Details finden Sie in der GNU General Public License.
Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem
Programm erhalten haben. Falls nicht, schreiben Sie an die
Free Software Foundation, Inc.,
59 Temple Place,
Suite 330,
Boston, MA 02111-1307,
USA.
*/

import java.io.*;             // File-I/O
import org.xml.sax.*;
import org.xml.sax.helpers.*; // SAXParserFactory
import javax.xml.parsers.*;   // SAXParser

public class parsen2 extends DefaultHandler {
Node    root   = null;  // erster  Node im Baum
Node    last   = null;  // letzter Node im Baum
boolean append = false; // anh�gen oder einfgen

 static public void showTree( Node node, int level) {
  if (node == null) return;
/*
  for (int i=0; i < level; i++)
       System.out.print( " ");
  System.out.println( (String)node.object);
*/
  showTree( node.child, level+1);

  for (int i=0; i < level; i++)
       System.out.print( " ");
  System.out.println( (String)node.object);

  showTree( node.next,  level);
 }

 static public void main( String[] args) {
 DefaultHandler handler = new parsen2();
 File           file    = new File( "math1.xml");

  if   (file.canRead())
       {
        try   {
              SAXParserFactory factory = SAXParserFactory.newInstance();
              SAXParser        parser  = factory.newSAXParser();

               parser.parse( file, handler);
              }
        catch (Throwable t)
              {
               t.printStackTrace();
              }
       }
  else {
        System.out.println( "Datei ist unbekannt.");
        System.exit( 1);
       }

  System.out.println( "\n\nSAX-Parsing abgeschlossen, anzeigen des Baums:");
  showTree( ((parsen2)handler).root, 0);
 }

 public void startDocument() {
  System.out.println( "Anfang des Dokuments");
 }

 public void endDocument() {
  System.out.println( "Ende des Dokuments");
 }

 public void startElement( String uri, String local, String tag, Attributes attrs) {
  System.out.println( "Start "+tag);
  insert( tag);
  append = false;
 }

 public void endElement( String uri, String local, String tag) {
  System.out.println( "End   "+tag);
  last   = last.parent;
  append = true;
 }

 public void characters( char[] ch, int start, int length) {
 String str = new String( ch, start, length);

  str = str.trim();
  if (str.length() < 1) return;
  System.out.println( "["+str+"]");
  insert( str);
 }

 public void insert( String str) {
 Node node = new Node();

  node.object = str;
  if   (root == null)
        root  = node; // einziger Node ist Wurzel
  else {
        if   (append)
             last.next   = node; // Node ist Nachfolger
        else last.child  = node; // Node ist ChildNode
        node.parent = last;      // Node hat Last als Elter
       }
  last = node; // Neuer ist Letzter
 }
}

