Advanced   Java   Services StAX   XMLEventReader Back Next Up Home


XMLEventReader

Liest man eine XML-Datei mit einem XMLEventReader, so spricht man von Iteratorverfahren im Gegensatz zum Cursorverfahren beim XMLStreamReader. Da man auch beim Cursorverfahren iteriert sind die Bezeichnungen nicht sehr glücklich gewählt. Die Vorgehensweise ist etwas aufwendiger, dafür aber flexibler. Bei jeder Iteration wird ein XMLEvent-Objekt erzeugt. Mit diesem Objekt wird der Typ des Events ermittelt. Die Auswertung ähnelt dann der beim XMLStreamReader.

XMLEventReader und XMLStreamReader benutzen dieselbe Factory.


Codeschema main

Das Erzeugen des Readers ist einfach. Interessant ist der Handler, der in eine eigene Klasse verlegt wird.

try
{
   XMLInputFactory factory = XMLInputFactory.newInstance();
   // com.sun.xml.internal.stream.XMLInputFactoryImpl
   XMLEventReader xmlEventReader = factory.createXMLEventReader(new FileReader("buecher.xml"));
   // com.sun.xml.internal.stream.XMLEventReaderImpl
   MyXMLEventReaderHandler handler = new MyXMLEventReaderHandler(xmlEventReader);
}
catch (FileNotFoundException | XMLStreamException  ex)
{
   ex.printStackTrace();
}

Ein TestHandler

In einer einfachen Fassung des Handlers wird nur festgestellt, an welchen Stellen Events ausgelöst werden.

public class MyXMLEventReaderHandler implements XMLStreamConstants
{
   XMLEventReader xmlEventReader;

   public MyXMLEventReaderHandler(XMLEventReader xmlEventReader) throws XMLStreamException
   {
      this.xmlEventReader = xmlEventReader;
      eventInfo();
   }

   private void eventInfo() throws XMLStreamException
   {
      while(xmlEventReader.hasNext())
      {

         XMLEvent event = xmlEventReader.nextEvent();

         switch (event.getEventType())
         {
         case CHARACTERS:
            System.out.println("CHARACTERS");
            break;
         case START_DOCUMENT:
            System.out.println("START_DOCUMENT");
            break;
         case END_DOCUMENT:
            System.out.println("END_DOCUMENT");
            break;
         case START_ELEMENT:
            System.out.println("START_ELEMENT");
            break;
         case END_ELEMENT:
            System.out.println("END_ELEMENT");
            break;
         default:
            System.out.println("default " + event.getEventType()); //
         }
      }
   }
}

Die Stoppstellen

Es kommen hier nur vier verschiedene Zustände vor: START_ELEMENT, END_ELEMENT, CHARACTERS, END_DOCUMENT


Die XML-Datei

Wir lesen dieselbe Datei ein wie bei XMLStreamReader, siehe.


Der Handler
public class MyXMLEventReaderHandler implements XMLStreamConstants
{
   XMLEventReader xmlEventReader;

   public MyXMLEventReaderHandler(XMLEventReader xmlEventReader) throws XMLStreamException
   {
      this.xmlEventReader = xmlEventReader;
      handleEvents();
   }

   private void handleEvents() throws XMLStreamException
   {
      int count=0;

      while (xmlEventReader.hasNext())
      {

         XMLEvent event = xmlEventReader.nextEvent();

         switch (event.getEventType())
         {
         case START_ELEMENT:
            StartElement startElement = event.asStartElement();

            QName qName = startElement.getName();
            String name = qName.toString();
            if (name.equals("buch"))
            {
               System.out.println("Buch");
               Iterator iter = startElement.getAttributes();
               while (iter.hasNext())
               {
                  Attribute att = iter.next();
                  System.out.print(att.getName() + " ");
                  System.out.println(att.getValue());
               }
            }

            if (name.equals("autor")) System.out.println("Autor");
            if (name.equals("vorname")) count = 1;
            if (name.equals("nachname")) count = 0;
            if (name.equals("isbn"))
            {
               String isbnType = "";
               Iterator iter = startElement.getAttributes();
               while (iter.hasNext())
               {
                  Attribute att = iter.next();
                  isbnType = att.getValue();
               }
               System.out.print("ISBN-" + isbnType + ": ");
            }
            break;

         case CHARACTERS:
            Characters chars = event.asCharacters();
            // System.out.println("count = " + count);
            if (!chars.isWhiteSpace())
            {

               if (count == 1)
               {
                  String data = chars.getData();
                  System.out.print(data + " ");
               }
               if (count == 0)
               {
                  String data = chars.getData();
                  System.out.println(data);
               }
            }
            break;

         } // end switch

      } // end while
   }
}

Der Output
Buch
type paperback
Deutschland, ein Wintermaerchen
Autor
Heinrich Heine
ISBN-10: 3-86666-192-9
Buch
type paperback
Der Untertan
Autor
Heinrich Mann
ISBN-10: 3-86677-192-9
Buch
type hardcover
Erfolg
Autor
Lion Feuchtwanger
ISBN-10: 3-86688-192-9

Valid XHTML 1.0 Strict top Back Next Up Home