# SAXParser Klasse



## javanoob88 (30. Okt 2010)

Hallo,

Ich habe meine DocumentHandler Klasse geschrieben, in der ich die Methoden hab, die der Parser beim sequenziellen Durchgehen des xml Files aufruft (startElement, endElement,...usw.)
Jetzt habe ich einen speziellen Parser (egal welcher/woher), der als abtrakte Klasse vordefiniert ist.
Jetzt bin ich ziemlich verwirrt, was meine Parser Klasse angeht. Bisher sieht die so aus:

```
public class XmlSaxParser extends MatsimXmlParser //spezieller Parser{
	
	private String fileName;
	BufferedReader reader = IOUtils.getBufferedReader(fileName);
	InputSource source = new InputSource(reader);
	String parserClass = "MatsimXmlParser";
//der Handler...
	XmlPersonDocumentHandler handler = new XmlPersonDocumentHandler(false, null);
//(boolean validateXml, Collection<Person> persons) in der Collection werden die eingelesenen Objekte gespeichert 
//die letzten drei Zeilen gehen nicht
//wieso kann ich hier kein neues Parser Objekt erzeugen?
	MatsimXmlParser parser = new MatsimXmlParser(true);/*es wurde (boolean validateXml) übergeben */
//geht nicht
	parser.setDocumentHandler(handler);
//geht auch nicht
	parser.parse(source);	
}
```
Blick grad auch nicht mehr, was genau beim Parsen und speichern von wem erledigt wird...


----------



## Marcinek (30. Okt 2010)

Abstrakte Klassen kann man nicht instanziieren.

Du musst new XmlSaxParser () machen, damit DEIN Parser genommen wird.

Was sagt er den bei dem "Geht nicht?"


----------



## javanoob88 (31. Okt 2010)

ok dass man abstrakte klassen nicht instanziieren kann, aber wieso muss ich denn die methoden aus der klasse übernehmen. will ich ja gar nicht (das waren ja endElement, usw... die habe ich in den ContentHandler gepackt). aber ich brauche den Parser doch, um parsen zu lassen (klar ?!? )

```
//hier kommt beides mal: syntax error(s) on token, misplaced construct(s)
//Sytax error on token handler, VariableDeclarationId expected after this 
//token
parser.setDocumentHandler(handler);
parser.parse(source);
```
also die parse Methode steckt ja in der abstrakten Klasse MatsimXmlParser. die müsste ich doch einfach aufrufen können...
btw. jemand ne gute idee, was ich für JUnit tests machen könnte?
Danke!


----------



## Noctarius (31. Okt 2010)

Hä? Jetzt noch mal langsam. Du willst die Methode "parse" aufrufen, soweit konnte ich dir folgen. Ist diese methode als abstract gekennzeichnet, dann brauchst du zwangsweise eine Implementierung dafür.


----------



## javanoob88 (31. Okt 2010)

die Methode selbst ist nicht abstract, sondern protected, steht aber in der abstract Klasse


----------



## Noctarius (31. Okt 2010)

Dann brauchst du sie in deiner Ableitung auch nicht überschreiben. Du benötigst aber weiterhin eine Ableitung der Klasse um diese dann zu instanzieren.


----------



## javanoob88 (31. Okt 2010)

ich dachte, dass ich das gemacht hätte:

```
public class XmlSaxParser extends MatsimXmlParser{
	
	private String fileName;
	BufferedReader reader = IOUtils.getBufferedReader(fileName);
	InputSource source = new InputSource(reader);
	String parserClass = "MatsimXmlParser";
	XmlPersonDocumentHandler handler = new XmlPersonDocumentHandler(false, null);
	MatsimXmlParser parser = new XmlSaxParser();
	parser.setDocumentHandler(handler);
	parser.parse(source);	
}[/B]
```

also hier meckert er mir an den letzten 2 zeilen rum (siehe vorletzter post) und in der ersten zeile, dass ich die methoden der abstract klasse überschreiben soll (2 stück, nämlich startTag und endTag(, die ja glaube ich vom Parser aufgerufen werden, wenn er leere Tags findet...))


----------



## Noctarius (31. Okt 2010)

Und wo ist da die Methode in dem das Ganze ausgeführt werden soll? Code kann nicht direkt in einer Klasse stehen. Abgesehen davon muss deine neue Ableitung irgendwo instanziert werden.


----------



## javanoob88 (31. Okt 2010)

ok blöd von mir formuliert, aber das ist ja gerade mein problem!
ich habe die methode parse ja bereits in der abstract Klasse. der methoden aufruf müsste dann ja nur noch in der main Methode (,die ich noch implementieren werde) stehen oder?
ich muss ja aber trotzdem noch eine parser Klasse schreiben, weil ich doch nicht einfach die abstract Klasse in der main Methode instanzieren und deren Methoden aufrufen kann!?


----------



## Noctarius (31. Okt 2010)

Nein, du brauchst eine Instanz. die parse-methode ist nicht statisch also brauchst du eine Instanz.


----------



## javanoob88 (1. Nov 2010)

Ich bekomms nicht hin!
1. Ich kann die abstrakte Klasse ja wie gesagt nicht instanziieren, also muss ich mir eine neue Parser Klasse schreiben, die sich aus der vorhandenen ableitet. Was muss die dann aber genau machen? Alles, was ich brauche ist doch ein Objekt meiner abstrakten Klasse, damit ich auf deren Methode parse zugreifen kann!!! :bahnhof:

2. Ich habe die Klasse XmlDocumentHandler. Kann mir nun bitte jemand in einem Stückchen Code zeigen, wie ich wenigstens den Handler benutzen kann (mit dem Standard SAXParser). Habe mir das Beispiel auf Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 15.5 Serielle Verarbeitung von XML mit SAX angeschaut, funktioniert bei mir aber so nicht. Da kommt dann die Meldung, dass er nicht vom DefaultHandler zu meinem konvertieren kann...


----------



## Marcinek (1. Nov 2010)

1) Absrtakte Klassen kann micht nicht instanziieren  Du brauchst eine konkrete Implementierung.

2) Weil du nicht richtig gelesen hast:




```
class PartyHandler extends DefaultHandler
```

Sowas kommt bei dir sicher nicht vor.


----------



## timbeau (2. Nov 2010)

Ich bin nicht der XMl-Profi aber ich musste auch sehr große Dateien parsen und dafür habe ich eine SAXParserFactory genutzt und aus dieser Factory einen SAXParser generiert. 
Warum willst du denn einen eigenen anlegen? Den ContentHandler kannst du ja auch bei dem SAXParser überschreiben.


----------

