samedi 25 avril 2015

SAX Parser implementieren

Guten Abend,

ich muss einen SAX Parser implementieren, der alle XML Files mit folgendem Aufbau parsen kann:

Java Code:

  1. <?xml version="1.0" encoding="UTF-8"?><blumen>
  2. <narzisse>
  3. <bluetezeit>2</bluetezeit>
  4. <farbe>weiss</farbe></narzisse>
  5. <rose>
  6. <preis>1</preis>
  7. <bluetezeit>3</bluetezeit>
  8. <farbe>rot</farbe></rose>
  9. <tulpe>
  10. <preis>1</preis>
  11. <bluetezeit>1</bluetezeit>
  12. <farbe>rot</farbe></tulpe></blumen>


Mein Parser sieht bisher so aus:

Java Code:

  1. class BlumenHandler extends DefaultHandler {
  2. private Blumenladen bl;
  3. private Blume blume;
  4. private String text;
  5.  
  6. public Blumenladen getBlumenladen() {
  7. return bl;
  8. }
  9.  
  10. public void startDocument() {
  11. bl = new Blumenladen();
  12. }
  13.  
  14. public void startElement(String namespaceURI, String localName,
  15. String qName, Attributes atts) {
  16.  
  17. if (qName.equals("narzisse"))
  18. blume = new Narzisse();
  19.  
  20. if (qName.equals("rose"))
  21. blume = new Rose();
  22.  
  23. if (qName.equals("tulpe"))
  24. blume = new Tulpe();
  25.  
  26.  
  27. }
  28.  
  29. public void characters(char[] chs, int start, int length) {
  30. text = String.valueOf(chs, start, length);
  31. }
  32.  
  33. public void EndElement(String namespaceURI, String localName, String qName) {
  34.  
  35. if (qName.equals("bluetezeit"))
  36. blume.setBluetezeit(Integer.parseInt(text));
  37.  
  38. if (qName.equals("farbe"))
  39. blume.setFarbe(Farbe.valueOf(text));
  40.  
  41. if (qName.equals("preis"))
  42. blume.setPreis(Double.parseDouble(text));
  43.  
  44. if (qName.equals("narzisse") || qName.equals("rose") || qName.equals("tulpe"))
  45. bl.addBlume(blume);
  46.  
  47. }
  48. }


Zugrunde liegen eine Klasse Blumenladen:
Java Code:

  1. public class Blumenladen implements Iterable<Blume> {
  2.  
  3.  
  4. //Liste, um alle vorhandenen Blumen im Laden zu speichern
  5. private LinkedList<Blume> blumenbestand;
  6.  
  7.  
  8. public Blumenladen(){
  9. blumenbestand = new LinkedList<Blume>();
  10. }
  11.  
  12.  
  13. //Methode um eine Blume dem Blumenbestand hinzuzufuegen
  14. public void addBlume(Blume b){
  15. blumenbestand.add(b);
  16. }
  17.  
  18.  
  19. //Methode, um eine Blume aus dem Blumenbestand zu loeschen
  20. public void removeBlume(Blume b){
  21. blumenbestand.remove(b);
  22. }
  23.  
  24.  
  25.  
  26.  
  27. @Override
  28. public String toString(){
  29. return blumenbestand.toString();
  30. }
  31.  
  32.  
  33.  
  34. @Override
  35. public Iterator<Blume> iterator() {
  36. return blumenbestand.iterator();
  37. }
  38. }


und eine abstrakte Klasse Blumen:

Java Code:

  1. public abstract class Blume {
  2.  
  3.  
  4. public abstract void setPreis(double preis);
  5. public abstract void setFarbe(Farbe farbe);
  6. public abstract void setBluetezeit(int bluetezeit);
  7. }


Die Klassen Narzisse, Tulpe und Rose erben von BLume und spezifizieren die Typen.

Des Weiteren gibt es für die Farbe der Blumen:
Java Code:

  1. public enum Farbe {
  2. ROT,ORANGE,WEISS,GELB,ROSA
  3. }


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 Code:

  1. public class MeinSaxBlumenladen {
  2.  
  3.  
  4. public static void main(String [] args) throws Exception {
  5.  
  6. //Eingabe des Pfads als Kommandozeilenargument
  7. System.out.println("Bitte den Dateipfad angeben: ");
  8. Scanner sc = new Scanner(System.in);
  9. String eingabe = sc.nextLine();
  10.  
  11. SAXParserFactory factory = SAXParserFactory.newInstance();
  12. SAXParser saxParser = factory.newSAXParser();
  13. BlumenHandler handler = new BlumenHandler();
  14. saxParser.parse(new File(eingabe), handler);
  15. Blumenladen blumenladen = handler.getBlumenladen();
  16.  
  17.  
  18.  
  19. System.out.println(blumenladen.toString());
  20.  
  21. }
  22. }


SAX Parser implementieren

0 commentaires:

Enregistrer un commentaire