Advanced Java Services | StAX 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.
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(); }
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()); // } } } }
Es kommen hier nur vier verschiedene Zustände vor: START_ELEMENT, END_ELEMENT, CHARACTERS, END_DOCUMENT
Wir lesen dieselbe Datei ein wie bei XMLStreamReader, siehe.
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"); Iteratoriter = 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 } }
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