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]
Mein bisheriger Java Code:
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
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]
Code:
<!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:
Java:
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);
}
}
Java:
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!");
}
}
Java:
/*
* @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