Guten Abend,
ich muss einen SAX Parser implementieren, der alle XML Files mit folgendem Aufbau parsen kann:
Mein Parser sieht bisher so aus:
Zugrunde liegen eine Klasse Blumenladen:
und eine abstrakte Klasse Blumen:
Die Klassen Narzisse, Tulpe und Rose erben von BLume und spezifizieren die Typen.
Des Weiteren gibt es für die Farbe der Blumen:
Ich hoffe das reicht zum Verständnis.
Ziel ist es, die Blumen aus dem XML File auszulesen und in der LinkedList in zu speichern. Diese möchte ich dann später ausgeben können.
ich muss einen SAX Parser implementieren, der alle XML Files mit folgendem Aufbau parsen kann:
Java:
<?xml version="1.0" encoding="UTF-8"?><blumen>
<narzisse>
<bluetezeit>2</bluetezeit>
<farbe>weiss</farbe></narzisse>
<rose>
<preis>1</preis>
<bluetezeit>3</bluetezeit>
<farbe>rot</farbe></rose>
<tulpe>
<preis>1</preis>
<bluetezeit>1</bluetezeit>
<farbe>rot</farbe></tulpe></blumen>
Mein Parser sieht bisher so aus:
Java:
class BlumenHandler extends DefaultHandler {
private Blumenladen bl;
private Blume blume;
private String text;
public Blumenladen getBlumenladen() {
return bl;
}
public void startDocument() {
bl = new Blumenladen();
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) {
if (qName.equals("narzisse"))
blume = new Narzisse();
if (qName.equals("rose"))
blume = new Rose();
if (qName.equals("tulpe"))
blume = new Tulpe();
}
public void characters(char[] chs, int start, int length) {
text = String.valueOf(chs, start, length);
}
public void EndElement(String namespaceURI, String localName, String qName) {
if (qName.equals("bluetezeit"))
blume.setBluetezeit(Integer.parseInt(text));
if (qName.equals("farbe"))
blume.setFarbe(Farbe.valueOf(text));
if (qName.equals("preis"))
blume.setPreis(Double.parseDouble(text));
if (qName.equals("narzisse") || qName.equals("rose") || qName.equals("tulpe"))
bl.addBlume(blume);
}
}
Zugrunde liegen eine Klasse Blumenladen:
Java:
public class Blumenladen implements Iterable<Blume> {
//Liste, um alle vorhandenen Blumen im Laden zu speichern
private LinkedList<Blume> blumenbestand;
public Blumenladen(){
blumenbestand = new LinkedList<Blume>();
}
//Methode um eine Blume dem Blumenbestand hinzuzufuegen
public void addBlume(Blume b){
blumenbestand.add(b);
}
//Methode, um eine Blume aus dem Blumenbestand zu loeschen
public void removeBlume(Blume b){
blumenbestand.remove(b);
}
@Override
public String toString(){
return blumenbestand.toString();
}
@Override
public Iterator<Blume> iterator() {
return blumenbestand.iterator();
}
}
und eine abstrakte Klasse Blumen:
Java:
public abstract class Blume {
public abstract void setPreis(double preis);
public abstract void setFarbe(Farbe farbe);
public abstract void setBluetezeit(int bluetezeit);
}
Die Klassen Narzisse, Tulpe und Rose erben von BLume und spezifizieren die Typen.
Des Weiteren gibt es für die Farbe der Blumen:
Java:
public enum Farbe {
ROT,ORANGE,WEISS,GELB,ROSA
}
Ich hoffe das reicht zum Verständnis.
Ziel ist es, die Blumen aus dem XML File auszulesen und in der LinkedList in zu speichern. Diese möchte ich dann später ausgeben können.
Java:
public class MeinSaxBlumenladen {
public static void main(String [] args) throws Exception {
//Eingabe des Pfads als Kommandozeilenargument
System.out.println("Bitte den Dateipfad angeben: ");
Scanner sc = new Scanner(System.in);
String eingabe = sc.nextLine();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
BlumenHandler handler = new BlumenHandler();
saxParser.parse(new File(eingabe), handler);
Blumenladen blumenladen = handler.getBlumenladen();
System.out.println(blumenladen.toString());
}
}