Ich habe in einem Beipsiel zu "StAX" diesen Codesnippet
Er funktioniert auch. Für mich ist aber nicht klar, wie.
Nach der SDK sind u.a. XMLEvent , StartEvent Interfaces.
Meine Frage ist nun, wie es möglich ist, Inferfaces als Rückgabewert zu übergeben, oder methoden in Interfaces über den Interfacenamen aufzurufen. Typisch wird das doch über die Klassen gtan, wo die Interfaces implementiert sind. In der SDK findet man nur, dass das Super-Interface "XMLStreamConstants" in der Klasse "StreamReaderDelegate" implementiert ist.
Java:
package de.vogella.xml.stax.read;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import de.vogella.xml.stax.model.Item;
public class StaXParser {
static final String DATE = "date";
static final String ITEM = "item";
static final String MODE = "mode";
static final String UNIT = "unit";
static final String CURRENT = "current";
static final String INTERACTIVE = "interactive";
@SuppressWarnings({ "unchecked", "null" })
public List<Item> readConfig(String configFile) {
List<Item> items = new ArrayList<Item>();
try {
// First create a new XMLInputFactory
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
// Setup a new eventReader
InputStream in = new FileInputStream(configFile);
XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
// Read the XML document
Item item = null;
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
StartElement startElement = event.asStartElement();
// If we have a item element we create a new item
if (startElement.getName().getLocalPart() == (ITEM)) {
item = new Item();
// We read the attributes from this tag and add the date
// attribute to our object
Iterator<Attribute> attributes = startElement
.getAttributes();
while (attributes.hasNext()) {
Attribute attribute = attributes.next();
if (attribute.getName().toString().equals(DATE)) {
item.setDate(attribute.getValue());
}
}
}
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart()
.equals(MODE)) {
event = eventReader.nextEvent();
item.setMode(event.asCharacters().getData());
continue;
}
}
if (event.asStartElement().getName().getLocalPart()
.equals(UNIT)) {
event = eventReader.nextEvent();
item.setUnit(event.asCharacters().getData());
continue;
}
if (event.asStartElement().getName().getLocalPart()
.equals(CURRENT)) {
event = eventReader.nextEvent();
item.setCurrent(event.asCharacters().getData());
continue;
}
if (event.asStartElement().getName().getLocalPart()
.equals(INTERACTIVE)) {
event = eventReader.nextEvent();
item.setInteractive(event.asCharacters().getData());
continue;
}
}
// If we reach the end of an item element we add it to the list
if (event.isEndElement()) {
EndElement endElement = event.asEndElement();
if (endElement.getName().getLocalPart() == (ITEM)) {
items.add(item);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
return items;
}
}
Er funktioniert auch. Für mich ist aber nicht klar, wie.
Nach der SDK sind u.a. XMLEvent , StartEvent Interfaces.
Meine Frage ist nun, wie es möglich ist, Inferfaces als Rückgabewert zu übergeben, oder methoden in Interfaces über den Interfacenamen aufzurufen. Typisch wird das doch über die Klassen gtan, wo die Interfaces implementiert sind. In der SDK findet man nur, dass das Super-Interface "XMLStreamConstants" in der Klasse "StreamReaderDelegate" implementiert ist.