# Parsen und transformieren von XML-Dateien mit JAVA



## Tikonteroga (26. Juni 2007)

Hallo,

ich befinde ich zur Zeit in einem Praktikum und meine Aufgabe ist es ein Programm in JAVA zu schreiben, das eine XML-Datei parsed (validation nach DTD oder Schema) und anschließend in ein durch ein XSL-Stylesheet vorgegebenes Ausgabeformat transformiert.

Ich habe mich entschlossen für mein Programm den XMLReader als Parser zu verwenden. Mir ist es auch schon gelungen eine XML-Datei erfolgreich zu parsen und zu transformieren.


```
XMLReader xmlReader;
xmlReader = XMLReaderFactory.createXMLReader();

//Eigene Implementierung eines ContentHandler
ContentHandlerExtImpl contentHandler = new ContendHandlerExtImpl();
//Implementierung einer selbst definierten Ausgabe von Parse-Ereignissen.
ContentViewImpl view = new ContentViewImpl();
contentHandler.setContentView(view);

xmlReader.setContentHandler(contentHandler);

InputSource inputSource = new InputSource("source.xml");
SAXSource saxSource = new SAXSource(xmlReader, inputSource);
			
FileOutputStream fileOutputStream = new FileOutputStream("destination.html");
StreamResult streamResult = new StreamResult (fileOutputStream);
			
TransformerFactory factory = TransformerFactory.newInstance();
			
File file = new File ("style.xsl");
StreamSource streamSource = new StreamSource(file);
			
Transformer transformer = factory.newTransformer(streamSource);
transformer.transform(saxSource, streamResult);
```

Nun habe ich aber das Problem, dass im Konstruktor der Klasse SAXSource meine Implementierung des ContentHandlers durch einen TransformerHandler, der ebenfalls das Interface ContentHandler implementiert ersetzt wird.


```
SAXSource saxSource = new SAXSource(xmlReader, inputSource);
```

Gibt es vielleicht auch eine andere möglichkeit eine SAXSource zu erstellen, so dass ich meinen eigenen ContentHandler verwenden kann.

Mein Ansatz war, ein Objekt der Klasse TransformerHandler in meinem ContentHandler zu kapseln (Komposition), so dass mein ContentHandler die implementierten Methoden des TransformerHandler aufrufen kann. Aber ich finde keinen Weg eine SAXSource zu bekommen, die ich dann an den Transformer übergeben kann, damit dieser die XSL-Transformation durchführt.


```
Transformer transformer = factory.newTransformer(streamSource);
transformer.transform(saxSource, streamResult);
```

Würde mich freuen, wenn mir jemand weiterhelfen könnte. Ich muss dieses Problem unbedingt lösen, damit ich die Modellierung abschließen und mit der Implementierung beginnen kann.

Gruß

Tikonteroga


----------

