# XML SAX Parser



## chrisööö (4. Dez 2011)

Hallo Leute,
ich muss einen XML Parser (SAX) schreiben, der mir eine zuvor erstellte Rezepte.xml Datei parst.
Es sollen die Daten ausgelesen werden und als Objekt instanziert werden. Danach soll alles wieder in eine neue XML Datei herausgeschrieben werden. Momentan stehe ich vor dem Problem die Datei auszulesen. Besser gesagt ist das Problem, Tags, die häufiger in der Rezepte.xml Datei vorkommen wie <menge></menge> und <bezeichnung></bezeichnung>. Wie realisiere ich das am besten? Alles andere wird ausgelesen. Ich muss dazu sagen das ich mit dem parsen von XML Dateien zuvor noch nie gearbeitet habe.

[XML]<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE rezepte SYSTEM "Rezepte.dtd">

<!--Es folgt Rezept 1-->
<kochbuch>
<rezept>
<titel>Kürbis, Kartoffeln und Hähnchenschenkel aus dem Backofen</titel>
<untertitel>Einfaches und sehr schmackhaftes Kürbisgericht</untertitel>
<kurzbeschreibung>Ein Gericht das schnell zubereitet aus dem Backofen Köstliche Hähnchenschenkel zaubert und Sie begeistern wird.</kurzbeschreibung>

<einkaufsliste>
<menge>1</menge><bezeichnung>Kürbis</bezeichnung>
<menge>750g</menge><bezeichnung>Kartoffel(n), vorwiegend festkochende</bezeichnung>
<menge>etwas</menge><bezeichnung>Olivenöl</bezeichnung>
<menge>1TL</menge><bezeichnung>Salz, Pfeffer (schwarz)</bezeichnung>
<menge>1TL</menge><bezeichnung>Knoblauchpaste</bezeichnung>
<menge>4</menge><bezeichnung>Zweig/e Rosmarin</bezeichnung>
<menge>6</menge><bezeichnung>Zweig/e Thymian, nur die Blätter davon</bezeichnung>
<menge>6</menge><bezeichnung>Hähnchenkeulen</bezeichnung>
</einkaufsliste>
<rezeptanleitung>
<anweisungsfolge>Den Kürbis (1-2 Stück, je nach Größe) Teilen, Kerne entfernen, schälen, in nicht zu kleine Würfel schneiden.
Kartoffeln schälen und in Würfel (gleiche Größe wie die Kürbiswürfel) schneiden.
Kürbis- und Kartoffelwürfel in eine Schüssel geben, großzügig salzen und pfeffern (Salz und Pfeffer durch "durchschütteln und
dabei in der Schüssel wenden") gleichmäßig verteilen.</anweisungsfolge>

<anweisungsfolge>Eine große Auflaufform mit Olivenöl und Knoblauchpaste auspinseln (alternativ zwei Knoblauchzehen schälen und
pressen und in der Auflaufform verteilen), die gewürzten Kartoffel- und Kürbiswürfel in der Auflaufform verteilen.</anweisungsfolge>

<anweisungsfolge>Rosmarinzweige zwischen die Kartoffel-Kürbis-Masse stecken, Thymianblätter darüber geben.</anweisungsfolge>

<anweisungsfolge>Die Auflaufform in den vorgeheizten Backofen bei 200°C Ober-/Unterhitze stellen, mittlere Einschubleiste.
</anweisungsfolge>

<anweisungsfolge>15 Minuten backen lassen.</anweisungsfolge>

<anweisungsfolge>In der Zwischenzeit die 6 Hähnchenschenkel (alternativ gehen auch Hähnchenunterschenkel, dann bitte 12 Stück
unter fließend kaltem Wasser waschen, mit Küchenpapier trocken tupfen.</anweisungsfolge>

<anweisungsfolge>Etwas Öl (gerne Olivenöl, aber auch jedes Pflanzenöl geht) mit Salz, Pfeffer und Paprikapulver anrühren und die Hähnchenkeulen
großzügig einpinseln.</anweisungsfolge>

<anweisungsfolge>Nach den ersten 15 Minuten legt man die Hähnchenschenkel locker auf die Kartoffel- Kürbismasse, zunächst mit
der Unterseite nach Oben.</anweisungsfolge>

<anweisungsfolge>Nach etwa einer halben Stunde wendet man die Hähnchenschenkel.</anweisungsfolge>

<anweisungsfolge>Wenn die Hähnchenschenkel eine schöne Farbe haben (etwa eine weitere halbe Stunde später, ich möchte mich da
zeitlich nicht auf die Minute festlegen, da jeder Backofen anderes bäckt) ist das Gericht fertig.</anweisungsfolge>
</rezeptanleitung>
<koch>Frau Erika Mustermann</koch>
<datum>18.10.2011</datum>
</rezept>

<!--Es folgt Rezept 2-->
<rezept>
<titel>Vegetarische Nudeln</titel>
<untertitel>Kurz gebratene vegetarische Nudeln</untertitel>
<kurzbeschreibung>Vegetarische gebratene Nudeln die ihren Gaumen glücklich machen werden und deren Zubereitung ein Kinderspiel ist.</kurzbeschreibung>

<einkaufsliste>
<menge>250 g</menge><bezeichnung>chinesische Eiernudeln</bezeichnung>
<menge>4 EL</menge><bezeichnung>Öl (Erdnussöl)</bezeichnung>
<menge>1 Bund</menge><bezeichnung>Frühlingszwiebel(n) in Ringe geschnitten</bezeichnung>
<menge>2</menge><bezeichnung>Karotte(n), dünn geschnitten</bezeichnung>
<menge>2 Zehen</menge><bezeichnung>Knoblauch, zerdrückt</bezeichnung>
<menge>¼ TL</menge><bezeichnung>Chili, getrocknet</bezeichnung>
<menge>125 g</menge><bezeichnung>Zuckerschote(n)</bezeichnung>
<menge>125 g</menge><bezeichnung>Pilze (Shiitakepilze), halbiert</bezeichnung>
<menge>3 Köpfe</menge><bezeichnung>Chinakohl, geschnitzelt</bezeichnung>
<menge>2 EL</menge><bezeichnung>Sojasauce</bezeichnung>
<menge>3 TL</menge><bezeichnung>Sauce (Hoisinsoße)</bezeichnung>
</einkaufsliste>

<rezeptanleitung>
<anweisungsfolge>Die Nudeln in kochendes, leicht gesalzenes Wasser geben und vier Minuten al dente kochen.Anschließend das
Wasser abschütten.</anweisungsfolge>

<anweisungsfolge>Das Öl in einer großen Bratpfanne erhitzen, die Frühlingszwiebeln und die Karotten in das Öl geben und alles 3 Minuten dünsten.
Danach Knoblauch, Chili, Zuckererbsen und Pilze hinzufügen.</anweisungsfolge>

<anweisungsfolge>Nachdem alles 2 Minuten gebraten hat, den Chinakohl in die Pfanne geben und eine Minute dünsten.
Die abgetropften Nudeln sowie die Soja- und die Hoisinsoße mit dem Gemüse in der Pfanne mischen.
Das Gericht auf kleiner Flamme zwei Minuten braten, bis es durchgezogen ist, und sofort servieren.</anweisungsfolge>
</rezeptanleitung>

<koch>Herr Bernd Stellter</koch>
<datum>12.08.2009</datum>
</rezept>

<!--Es folgt Rezept 3-->
<rezept>
<titel>Artischocken mit kurzen Spaghetti</titel>
<untertitel>Kurze Spaghetti vereint mit Artischockenherzen</untertitel>
<kurzbeschreibung>Ein Vegetarisches Gericht zubereitet aus den feinsten Artischocken mit Spaghetti</kurzbeschreibung>

<einkaufsliste>
<menge>5</menge><bezeichnung>Artischocke(n)</bezeichnung>
<menge>1</menge><bezeichnung>Zwiebel(n)</bezeichnung>
<menge>5</menge><bezeichnung>Cocktailtomaten</bezeichnung>
<menge>etwas</menge><bezeichnung>Petersilie, glatt</bezeichnung>
<menge>etwas</menge><bezeichnung>Olivenöl</bezeichnung>
<menge>250 g</menge><bezeichnung>Spaghetti</bezeichnung>
</einkaufsliste>

<rezeptanleitung>
<anweisungsfolge>Artischocken von den äußeren Blättern befreien, bis nur noch das Herz übrig ist. Das Herz in vier Teile
schneiden und waschen. Die Zwiebel in Scheiben schneiden, die Cocktailtomaten halbieren.</anweisungsfolge>

<anweisungsfolge>Das Olivenöl erhitzen, die Artischocken mit den Zwiebeln und den Cocktailtomaten etwas andünsten,
mit Salz und Pfeffer würzen. Die Petersilie dazu geben und anschließend mit Wasser ablöschen.</anweisungsfolge>

<anweisungsfolge>Etwa 40 Min. köcheln lassen, wenn nötig etwas Wasser nachgießen. Nach Bedarf nachwürzen.</anweisungsfolge>

<anweisungsfolge>In der Zwischenzeit die Spaghetti zweimal durchbrechen und nach Packungsanleitung kochen.
Spaghetti und Artischockensoße in einem Pastateller servieren.</anweisungsfolge>
</rezeptanleitung>

<koch>Frau Gisela Bammberg</koch>
<datum>20.10.2010</datum>
</rezept>
</kochbuch>[/XML]


```
<!ELEMENT kochbuch (rezept)+>

    <!ELEMENT rezept (titel,untertitel,kurzbeschreibung,einkaufsliste,rezeptanleitung,koch,datum)+>


   <!ELEMENT titel (#PCDATA)>


   <!ELEMENT untertitel (#PCDATA)>
 

   <!ELEMENT kurzbeschreibung (#PCDATA)>


   <!ELEMENT einkaufsliste (menge,bezeichnung)+>
 

   <!ELEMENT menge (#PCDATA)>


   <!ELEMENT bezeichnung (#PCDATA)>
 

   <!ELEMENT rezeptanleitung (anweisungsfolge)+>
 

   <!ELEMENT anweisungsfolge (#PCDATA)>


   <!ELEMENT koch (#PCDATA)>


   <!ELEMENT datum (#PCDATA)>
```

Mein bisheriger Java Code:


```
import java.io.*;
import org.xml.sax.*;
import org.apache.xerces.parsers.SAXParser;



/**
 *
 * @author Christian Zander
 */
public class XMLParser {

    private static final String EINGABEURL = "Rezepte.xml";

    public void parseMe(String EINGABEURL) throws SAXException, IOException {
        XMLReader parser = new SAXParser();
        System.out.println("Parser wurde erstellt!");
    
        try {
            System.out.println("Dokument "+ EINGABEURL +" wird geparst...");
            parser.setContentHandler(new RezeptHandler());
            parser.parse(EINGABEURL);
        }
        catch (SAXException e) {
            System.err.println("Fehler beim parsen: " + e);
        }
        catch (IOException e) {
            System.err.println("Fehler beim Zugriff auf: "+ EINGABEURL +": "+ e);
        }
    }

    

    public static void main(String[] args) throws SAXException, IOException {

        XMLParser parser = new XMLParser();
        parser.parseMe(EINGABEURL);

    }

}
```


```
import java.util.ArrayList;
import org.xml.sax.*;

/**
 *
 * @author Christian Zander
 */
public class RezeptHandler implements ContentHandler {

    private Locator l;
    private Rezept rezept;
    private String currentValue;
    private ArrayList<Rezept> alleRezepte = new ArrayList<Rezept>();
    

    public void characters(char[] ch, int start, int length)
      throws SAXException {
    currentValue = new String(ch, start, length);
    }

    public void startDocument() {
        System.out.println("Das Dokument beginnt...");
    }

    public void endDocument() {
        System.out.println("Das Dokument endet!");
    }

    public void setDocumentLocator(Locator l) {
        //System.out.println("Locator wurde gesetzt!");
        this.l = l;
    }

    public void startPrefixMapping(String prefix, String uri) {
        if(prefix.equals("")) {
            prefix="Default";
           // System.out.println("Namensraum wurde deklariert: "+prefix+" ("+uri+")");
        }
    }

    public void endPrefixMapping(String prefix) {
        if(prefix.equals("")) {
            prefix="Default";
           // System.out.println("Namensraum wurde geschlossen: "+prefix);
        }
    }

    public void startElement(String uri, String localName, String qName, Attributes atts) {
        if(localName.equals("rezept")){
            rezept = new Rezept();
            System.out.println("rezept erkannt");
        }
    }

    public void endElement(String uri, String localName, String qName) {
    
        if(localName.equals("titel")){
            rezept.setTitel(currentValue);
        }
        if(localName.equals("untertitel")){
            rezept.setUntertitel(currentValue);
        }

        if(localName.equals("kurzbeschreibung")){
            rezept.setKurzbeschreibung(currentValue);
        }

        
        
            
        if(localName.equals("menge")){
            rezept.setMenge(currentValue);
        }
        if(localName.equals("bezeichnung")){
            rezept.setBezeichnung(currentValue);
        }
       
        
        
        
        if(localName.equals("anweisungsfolge")){
            rezept.setAnweisungsfolge(currentValue);
        }
        
        if(localName.equals("koch")){
            rezept.setKoch(currentValue);
        }
        if(localName.equals("datum")){
            rezept.setDatum(currentValue);
        }
        if (localName.equals("rezept")) {
            alleRezepte.add(rezept);
            System.out.println(rezept);
        }
    }

    public void ignorableWhitespace(char[] ch, int start, int length) {
       // System.out.println("");
    }

    public void processingInstruction(String target, String data) {
       // System.out.println("Processing Instruction "+target+": "+data);
    }

    public void skippedEntity(String name) {
       // System.out.println("Entity "+name+" wurde ausgelassen!");
    }
}
```


```
/*
 * @author Christian
 */
public class Rezept {

    
    private String titel;
    private String untertitel;
    private String kurzbeschreibung;
    private String menge;
    private String bezeichnung;
    private String anweisungsfolge;
    private String koch;
    private String datum;

    public Rezept() {
    }

    

    public String getTitel() {
        return titel;
    }
    public void setTitel(String titel) {
        this.titel=titel;
    }

    public String getUntertitel() {
        return untertitel;
    }
    public void setUntertitel(String untertitel) {
        this.untertitel=untertitel;
    }

    public String getKurzbeschreibung() {
        return kurzbeschreibung;
    }
    public void setKurzbeschreibung(String kurzbeschreibung) {
        this.kurzbeschreibung=kurzbeschreibung;
    }

    public String getMenge() {
        return menge;
    }
    public void setMenge(String menge) {
        this.menge=menge;
    }

    public String getBezeichnung() {
        return bezeichnung;
    }
    public void setBezeichnung(String bezeichnung) {
        this.bezeichnung=bezeichnung;
    }

    public String getAnweisungsfolge() {
        return anweisungsfolge;
    }
    public void setAnweisungsfolge(String anweisungsfolge) {
        this.anweisungsfolge=anweisungsfolge;
    }

    public String getKoch() {
        return koch;
    }
    public void setKoch(String koch) {
        this.koch=koch;
    }

    public String getDatum() {
        return datum;
    }
    public void setDatum(String datum) {
        this.datum=datum;
    }

    @Override
    public String toString() {
    return "[" + this.titel + "]\n"
            + "[" + this.untertitel + "]\n"
            + "[" + this.kurzbeschreibung + "]\n"
            + "[" + this.menge + "]\n"
            + "[" + this.bezeichnung + "]\n"
            + "[" + this.anweisungsfolge + "]\n"
            + "[" + this.koch + "]\n"
            + "[" + this.datum + "]\n";
  }
}
```

Es ist eine Menge Code aber ich hoffe mir kann Jemand helfen den Rest der XML Datei ebenfalls vernünftig einzulesen. Ich komme an dieser Stelle momentan einfach nicht mehr weiter. ???:L


----------



## HoaX (5. Dez 2011)

Mei, musst halt an den passenden Stellen ein neues Objekt von Rezept erstellen und speichern und mit Daten füllen.
Aber wenn du es wirklich nur in ein neues XML-Format überführen willst, dann solltest du dir ehr mal XSLT anschauen, das ist genau dafür gemacht.


----------



## SlaterB (5. Dez 2011)

[xml]
<einkaufsliste>
<menge>1</menge><bezeichnung>Kürbis</bezeichnung>
<menge>750g</menge><bezeichnung>Kartoffel(n), vorwiegend festkochende</bezeichnung>
..
[/xml]
ist glaube ich kein gutes XML, einfach nur Elemente zu wiederholen, je zwei sollen anscheinend zusammengehören, 
eindeutiger wäre z.B.
[xml]
<einkaufsliste>
<zutat><menge>1</menge><bezeichnung>Kürbis</bezeichnung></zutat>
<zutat><menge>750g</menge><bezeichnung>Kartoffel(n), vorwiegend festkochende</bezeichnung></zutat>
..
[/xml]
wie auch immer, du kannst dich an alle Strukturen anpassen,
bei jedem <menge> ein neues Unterobjekt erstellen und in eine Liste einfügen, bei <bezeichnung> das hoffentlich nur eine offene (letzte) Objekt in der Liste ohne Bezeichnung nur mit Menge finden usw.,
die Daten sind da, du kannst damit arbeiten wenn du nur willst


----------



## chrisööö (5. Dez 2011)

Es soll mit SAX gemacht werden also kann ich leider auf nichts anderes zurück greifen.

Meine Ausgabe ist bis jetzt:

rezept erkannt
[Kürbis, Kartoffeln und Hähnchenschenkel aus dem Backofen]
[Einfaches und sehr schmackhaftes Kürbisgericht]
[Ein Gericht das schnell zubereitet aus dem Backofen Köstliche Hähnchenschenkel zaubertund Sie begeistern wird.]
[6]
[Hähnchenkeulen]
[Wenn die Hähnchenschenkel eine schöne Farbe haben (etwa eine weitere halbe Stunde später, ich möchte mich da zeitlich nicht auf die Minute festlegen, da jeder Backofen anderes bäckt) ist das Gericht fertig.]
[Frau Erika Mustermann]
[18.10.2011]

Leider lese ich immer nur den letzten Datensatz in meine Liste ein. Er springt aber über alle Datensätze was ich mit System.out.println kontrollieren konnte.
Ich frage mich was ich da genau falsch mache? (Bei der Anweisungsfolge ist es das gleiche Problem)


```
import java.util.ArrayList;
import org.xml.sax.*;

/**
 *
 * @author Christian Zander
 */
public class RezeptHandler implements ContentHandler {

    private Locator l;
    private Rezept rezept;
    private String currentValue;
    private ArrayList<Rezept> alleRezepte = new ArrayList<Rezept>();
    

    public void characters(char[] ch, int start, int length)
      throws SAXException {
    currentValue = new String(ch, start, length);
    }

    public void startDocument() {
        System.out.println("Das Dokument beginnt...");
    }

    public void endDocument() {
        System.out.println("Das Dokument endet!");
    }

    public void setDocumentLocator(Locator l) {
        //System.out.println("Locator wurde gesetzt!");
        this.l = l;
    }

    public void startPrefixMapping(String prefix, String uri) {
        if(prefix.equals("")) {
            prefix="Default";
           // System.out.println("Namensraum wurde deklariert: "+prefix+" ("+uri+")");
        }
    }

    public void endPrefixMapping(String prefix) {
        if(prefix.equals("")) {
            prefix="Default";
           // System.out.println("Namensraum wurde geschlossen: "+prefix);
        }
    }

    public void startElement(String uri, String localName, String qName, Attributes atts) {
        if(localName.equals("rezept")){
            rezept = new Rezept();
            System.out.println("rezept erkannt");
        }
    }

    public void endElement(String uri, String localName, String qName) {
      // System.out.println("Element "+qName+" ("+uri+") geschlossen.");
        if(localName.equals("titel")){
            rezept.setTitel(currentValue);
            //System.out.println(currentValue);
        }
        if(localName.equals("untertitel")){
            rezept.setUntertitel(currentValue);
            //System.out.println(currentValue);
        }

        if(localName.equals("kurzbeschreibung")){
            rezept.setKurzbeschreibung(currentValue);
            //System.out.println(currentValue);
        }

        
            
        if(localName.equals("menge")){
            rezept.setMenge(currentValue);
            //System.out.println(currentValue);
        }
        if(localName.equals("bezeichnung")){
            rezept.setBezeichnung(currentValue);
            //System.out.println(currentValue);
        }
            
        
        
        
        if(localName.equals("anweisungsfolge")){
            rezept.setAnweisungsfolge(currentValue);
            //System.out.println(currentValue);
        }

        if(localName.equals("rezeptanleitung")) {
        }
        
        if(localName.equals("koch")){
            rezept.setKoch(currentValue);
            //System.out.println(currentValue);
        }
        if(localName.equals("datum")){
            rezept.setDatum(currentValue);
            //System.out.println(currentValue);
        }
        if (localName.equals("rezept")) {
            alleRezepte.add(rezept);
            for (int i = 0; i < alleRezepte.size(); i++) {
            System.out.println(alleRezepte.get(i));
        }
            //alleRezepte.add(rezept);
            //System.out.println(currentValue);
            //System.out.println(rezept);
        }
    }

    public void ignorableWhitespace(char[] ch, int start, int length) {
       // System.out.println("");
    }

    public void processingInstruction(String target, String data) {
       // System.out.println("Processing Instruction "+target+": "+data);
    }

    public void skippedEntity(String name) {
       // System.out.println("Entity "+name+" wurde ausgelassen!");
    }
}
```


----------



## SlaterB (5. Dez 2011)

das ist wirklich nicht klar?
direkt neben
>   System.out.println("rezept erkannt")
steht 
>  rezept = new Rezept();
es gibt nur eine Rezept-Variable, sie wird neu belegt, was immer vorher drin war ist weg,
speichere Rezepte in einer Liste, schon sind alle da,

ist das nicht sehr sehr leicht zu verstehen?


----------



## chrisööö (5. Dez 2011)

Ok also ich habe jetzt folgendes:

Parser wurde erstellt!
Dokument Rezepte.xml wird geparst...
Das Dokument beginnt...
rezept erkannt
[Kürbis, Kartoffeln und Hähnchenschenkel aus dem Backofen]
[Einfaches und sehr schmackhaftes Kürbisgericht]
[Ein Gericht das schnell zubereitet aus dem Backofen Köstliche Hähnchenschenkel zaubertund Sie begeistern wird.]
[[1, Kürbis, 750g, Kartoffel(n), vorwiegend festkochende, etwas, Olivenöl, 1TL, Salz, Pfeffer (schwarz), 1TL, Knoblauchpaste, 4, Zweig/e Rosmarin, 6, Zweig/e Thymian, nur die Blätter davon, 6, Hähnchenkeulen]]
[[Den Kürbis (1-2 Stück, je nach Größe) Teilen, Kerne entfernen, schälen, in nicht zu kleine Würfel schneiden. Kartoffeln schälen und in Würfel (gleiche Größe wie die Kürbiswürfel) schneiden.Kürbis- und Kartoffelwürfel in eine Schüssel geben, großzügig salzen und pfeffern (Salz und Pfeffer durch "durchschütteln und dabei in der Schüssel wenden") gleichmäßig verteilen., Eine große Auflaufform mit Olivenöl und Knoblauchpaste auspinseln (alternativ zwei Knoblauchzehen schälen und pressen und in der Auflaufform verteilen), die gewürzten Kartoffel- und Kürbiswürfel in der Auflaufform verteilen., Rosmarinzweige zwischen die Kartoffel-Kürbis-Masse stecken, Thymianblätter darüber geben., Die Auflaufform in den vorgeheizten Backofen bei 200°C Ober-/Unterhitze stellen, mittlere Einschubleiste., 15 Minuten backen lassen., ernativ gehen auch Hähnchenunterschenkel, dann bitte 12 Stück unter fließend kaltem Wasser waschen, mit Küchenpapier trocken tupfen., Etwas Öl (gerne Olivenöl, aber auch jedes Pflanzenöl geht) mit Salz, Pfeffer und Paprikapulver anrühren und die Hähnchenkeulen großzügig einpinseln., Nach den ersten 15 Minuten legt man die Hähnchenschenkel locker auf die Kartoffel- Kürbismasse, zunächst mit der Unterseite nach Oben., Nach etwa einer halben Stunde wendet man die Hähnchenschenkel., Wenn die Hähnchenschenkel eine schöne Farbe haben (etwa eine weitere halbe Stunde später, ich möchte mich da zeitlich nicht auf die Minute festlegen, da jeder Backofen anderes bäckt) ist das Gericht fertig.]]
[Frau Erika Mustermann]
[18.10.2011]


```
import java.util.ArrayList;

/*
 * @author Christian
 */
public class Rezept {

    
    private String titel;
    private String untertitel;
    private String kurzbeschreibung;
    private String menge;
    private String bezeichnung;
    private String anweisungsfolge;
    private String koch;
    private String datum;
    private ArrayList einkaufsliste = new ArrayList();
    private ArrayList anweisungen = new ArrayList();

    public Rezept() {
    }

    

    public String getTitel() {
        return titel;
    }
    public void setTitel(String titel) {
        this.titel=titel;
    }

    public String getUntertitel() {
        return untertitel;
    }
    public void setUntertitel(String untertitel) {
        this.untertitel=untertitel;
    }

    public String getKurzbeschreibung() {
        return kurzbeschreibung;
    }
    public void setKurzbeschreibung(String kurzbeschreibung) {
        this.kurzbeschreibung=kurzbeschreibung;
    }

    public String getMenge() {
        return menge;
    }
    public void setMenge(String menge) {
        this.menge=menge;
        einkaufsliste.add(this.menge);
    }

    public String getBezeichnung() {
        return bezeichnung;
    }
    public void setBezeichnung(String bezeichnung) {
        this.bezeichnung=bezeichnung;
        einkaufsliste.add(this.bezeichnung);
    }

    public String getAnweisungsfolge() {
        return anweisungsfolge;
    }
    public void setAnweisungsfolge(String anweisungsfolge) {
        this.anweisungsfolge=anweisungsfolge;
        anweisungen.add(this.anweisungsfolge);
    }

    public String getKoch() {
        return koch;
    }
    public void setKoch(String koch) {
        this.koch=koch;
    }

    public String getDatum() {
        return datum;
    }
    public void setDatum(String datum) {
        this.datum=datum;
    }

    @Override
    public String toString() {
    return "[" + this.titel + "]\n"
            + "[" + this.untertitel + "]\n"
            + "[" + this.kurzbeschreibung + "]\n"
            + "[" + this.einkaufsliste + "]\n"
            + "[" + this.anweisungen + "]\n"
            + "[" + this.koch + "]\n"
            + "[" + this.datum + "]\n";
  }

    public static void main(String[] args) {
       
    }
}
```


```
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xml.sax.*;

/**
 *
 * @author Christian Zander
 */
public class RezeptHandler implements ContentHandler {

    private Locator l;
    private Rezept rezept;
    private String currentValue;
    private ArrayList<Rezept> alleRezepte = new ArrayList<Rezept>();
    

    public void characters(char[] ch, int start, int length)
      throws SAXException {
    currentValue = new String(ch, start, length);
    }

    public void startDocument() {
        System.out.println("Das Dokument beginnt...");
    }

    public void endDocument() throws SAXException {
        System.out.println("Das Dokument endet!");
        ErstelleXML xml = new ErstelleXML();
        try {
            xml.writeXML(alleRezepte);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(RezeptHandler.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(RezeptHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void setDocumentLocator(Locator l) {
        //System.out.println("Locator wurde gesetzt!");
        this.l = l;
    }

    public void startPrefixMapping(String prefix, String uri) {
        if(prefix.equals("")) {
            prefix="Default";
           // System.out.println("Namensraum wurde deklariert: "+prefix+" ("+uri+")");
        }
    }

    public void endPrefixMapping(String prefix) {
        if(prefix.equals("")) {
            prefix="Default";
           // System.out.println("Namensraum wurde geschlossen: "+prefix);
        }
    }

    public void startElement(String uri, String localName, String qName, Attributes atts) {
        if(localName.equals("rezept")){
            rezept = new Rezept();
            System.out.println("rezept erkannt");
        }
    }

//    public ArrayList getAlleRezepte() {
//        return alleRezepte;
//    }

    public void endElement(String uri, String localName, String qName) {
      // System.out.println("Element "+qName+" ("+uri+") geschlossen.");
        if(localName.equals("titel")){
            rezept.setTitel(currentValue);
            //System.out.println(currentValue);
        }
        if(localName.equals("untertitel")){
            rezept.setUntertitel(currentValue);
            //System.out.println(currentValue);
        }

        if(localName.equals("kurzbeschreibung")){
            rezept.setKurzbeschreibung(currentValue);
            //System.out.println(currentValue);
        }

        
        
            

        if(localName.equals("menge")){    
            rezept.setMenge(currentValue);
            //System.out.println(currentValue);
        }
        if(localName.equals("bezeichnung")){
            rezept.setBezeichnung(currentValue);
            //System.out.println(currentValue);
        }
          
        
            
        
        
        
        if(localName.equals("anweisungsfolge")){
            rezept.setAnweisungsfolge(currentValue);
            //System.out.println(currentValue);
            
        }

        if(localName.equals("rezeptanleitung")) {
        }
        
        if(localName.equals("koch")){
            rezept.setKoch(currentValue);
            //System.out.println(currentValue);
        }
        if(localName.equals("datum")){
            rezept.setDatum(currentValue);
            //System.out.println(currentValue);
        }
        if (localName.equals("rezept")) {
            alleRezepte.add(rezept);
            for (int i = 0; i < alleRezepte.size(); i++) {
            System.out.println(alleRezepte.get(i));
        }
            //alleRezepte.add(rezept);
            //System.out.println(currentValue);
            //System.out.println(rezept);
        }
    }

    public void ignorableWhitespace(char[] ch, int start, int length) {
       // System.out.println("");
    }

    public void processingInstruction(String target, String data) {
       // System.out.println("Processing Instruction "+target+": "+data);
    }

    public void skippedEntity(String name) {
       // System.out.println("Entity "+name+" wurde ausgelassen!");
    }
}
```

Jetzt ließt er mir immerhin alles ein.

Als Objekt ist es auch angelegt.
Jetzt muss ich die Sachen in dieser Form nur noch wieder in ein XML Dokument schreiben können mit den jeweiligen Tags. Funktioniert das so ?


----------



## SlaterB (5. Dez 2011)

es gibt verschiedene Wege zum Zusammenbau eines XML, mit dem Handler-Code hat das wenig zu tun,
ich empfehle im einfachen Fall ganz normale  String-Methoden, "<xy>"+xy+"</xy>"


----------



## chrisööö (5. Dez 2011)

Gibt es irgend welche guten Beispiele dafür?


----------



## SlaterB (5. Dez 2011)

ein System.out.println() ist nur eine Zeile, dafür gibts kein Beispiel,
wenn du zwei Dinge ausgeben willst, dann zwei Zeilen, auch dafür macht niemand ein Beispiel,
wenn du nichts ausgeben willst sondern String + String zusammenfügst ist das auch kein Beispiel wert,
irgendwo muss ein Kopf auch selben denken können


----------



## chrisööö (5. Dez 2011)

Ich dachte auch eher an ein Komplexeres Beispiel für ein Schreiben eines XML Files aus Meinen Objekten heraus. Sowie es auch Beispiele für das schreiben eines Sax Parsers gibt.


----------



## SlaterB (5. Dez 2011)

wie gesagt mag es da verschiedene Varianten geben, etwa JDOM-Baum aufbauen (*), 
ich kann dazu nichts gutes nennen, und habe das Einfache vorgeschlagen,

(*) das Einfügen aller Elemente in JDOM wäre auch der gleiche Durchlauf wie alles direkt auszugeben


----------

