Fragen zu SAX

ingo0815

Grünschnabel
Hallo Leute,
hoffe das sich hier Leute finden die mir weiterhelfen können. Bin absoluter Neuling in Sachen XML, SAX usw. Ich habe hier einen kleinen XML-Parser mit SAX geschrieben der mir dann auf der Konsole die einzelnen Infos des XML-Dokments ausgibt. Soweit funktioniert es auch prima. Nun würde ich aber gerne wissen wie ich statt einer Konsolenausgabe diese Infos weiterverarbeiten kann unter Java. Konkret geht es hier um Autos mit diversen Eigenschaften wie Hersteller, Modell, Leistung usw. Diese Infos sollen dann für jeden Datensatz je ein Objekt erstellen, also z.b Auto a1 = new Auto(BMW, 330d, 400PS) und Auto a2 = new Auto(VW, Golf, 80PS).

MfG Ingo
 
du hast ja die strings, also kannst du die entsprechenden parameter für die klassen parsen... poste mal etwas code, dann kann man dir hier auch noch im speziellen weiterhelfen :)
 
Also hier erst mal der Code von meinem Parser. Wenn ich jetzt nun in einer anderen Klasse ein Objekt Parser erstelle und dann die Methode parsen aufrufe wird der Inhalt des XML-Dokuments auf der Konsole angezeigt. Wollte hier nur zeigen das ich überhaupt etwas gemacht habe :-) Das Problem ist nun das ich überhaupt keine Ahnung habe wo ich nun genau ansetzen muss. Ich würde meinen das ich in der Methode startElement irgendwas tun muss damit die einzelnen XML-Tags in ein Array eingebaut werden. Aber da ich Arrays nur im Zusammenhang mit Zahlen kenne wüsste ich nicht wie man da nun Strings einbauen kann. Wie man sieht habe ich Null Ahnung wie man in dieser Sache nun weiter vorgeht.


Code:
public class Parser extends DefaultHandler {
	public void parsen() throws Exception{
		XMLReader x = XMLReaderFactory.createXMLReader();
		Parser handler = new Parser();
		x.setContentHandler(handler);
		x.parse("daten.xml");
	}
	
	public void startElement(String URI, String name, String qName, Attributes atts) {
		System.out.print(name);	
	}

	public void characters(char ch[], int start, int length) {
		String s = new String(ch, start, length);
		System.out.print(s);
	}
}
 
also um die daten zu speichern kannst du sie z.B. erstmal in eine ArrayList speichern. dann kannst du darin enthaltenen strings weiterverarbeiten. alternativ kann ich dir apache digester http://commons.apache.org/digester/ empfehlen, damit kannst du xml datein direkt auf objekte abbilden. falls du dazu näheres wissen möchtest, kann ich dir gerne etwas beispielcode posten.
grüße,
Clash
 
Hallo,
habe jetzt mal den Code erweitert wie ich es für sinnvoll halte. Mein Problem ist nun dieses Fragezeichen im Autoobjekt. Die Daten die da rein sollen möchte ich halt vom XML-File übernehmen anstatt sie manuell einzugeben. Und natürlich befindet sich im XML-File mehr als ein Auto. Sind überhaupt meine Erweiterungen hier richtig oder liege ich total falsch ?

MfG


Code:
public class Parser extends DefaultHandler {

private String Marke, Modell;
private int Leistung;
ArrayList l = new ArrayList;

       public Auto(String Marke, String Modell, int Leistung) {
                   this.Marke = Marke;
                   this.Modell = Modell;
                   this.Leistung = Leistung;
}

	public void parsen() throws Exception{
		XMLReader x = XMLReaderFactory.createXMLReader();
		Parser handler = new Parser();
		x.setContentHandler(handler);
		x.parse("daten.xml");
	}
	
	public void startElement(String URI, String name, String qName, Attributes atts) {
		System.out.print(name);	
	}

	public void characters(char ch[], int start, int length) {
		String s = new String(ch, start, length);
		System.out.print(s);
	}


        public void liste() {
        Auto a1 = new Auto(?)
        l.add(a1)
    }
}
 
prinzipiell ist das schon richtig, aber wie gesagt du musst die ausgaben aus "startElement" und "characters" zunächst in eine Liste stopfen, ungefähr so
Code:
List<String> eintraege = new ArrayList<String>();

public void startElement(String URI, String name, String qName, Attributes atts) {		
eintraege.add(name);
}
und dann kannst du sie als parameter an die Auto Klasse übergeben (da muss aber dann noch die Reihenfolge der Einträge beachtet werden, das is jetzt nur mal als beispiel gedacht)...
Code:
public Auto(ArrayList<String> eintraege) {
                   this.Marke = eintrage.get(0);
                   this.Modell = eintraege.get(1);
                   this.Leistung = Integer.parseInt(eintraege.get(2));
}

aber schau dir mal das digester an, damit umgehst du das ganze umständliche geparse per hand und bekommst gleich die objekte frei haus geliefert :) ...
 
Zuletzt bearbeitet:
Muss man für dieses Digester installieren oder kann man da gleich loslegen. Ich möchte eigentlich nix zusätzliches hinzufügen.
 
Sorry für die dummen Fragen aber wo bekomme ich die digester.jar her ? Oder habe ich sie etwa schon auf dem Rechner. Und können dann andere Benutzer über ein CVS auf diese Datei dann zugreifen ohne digeste ?

MfG
 
es gibt keine dummen fragen, nur dumme antworten ;)
also die digester bekommst du von dem link, den ich in einem post weiter oben geschrieben habe, dazu brauchst du noch ein paar utils klassen, wenn du magst kann ich dir das als paket per mail schicken...
welche "datei" meinst du, die du über cvs sharen willst? die digester oder das projekt?
 

Neue Beiträge

Zurück