# StreamSource parsen !



## Robson (10. Nov 2004)

Hallo,
Folgendes Szenario:

Ich sauge mir wie folgt einen StreamSource:


```
StreamSource xmlSource = new StreamSource(in);
```

über das XML was ich dort einlese lasse ich nen Mapping drüber laufen.
um aber herauszufinden welches Mapping er ausführen soll muss ich auf ein Attribut der XML Datei zugreifen.

Jetzt will ich aus dem Stream Source "xmlSource" mit dem DocumentBuilder ein XML Document erzeugen.
So das ich wie folgt auf das Element zugreifen kann:

CodeTeil A:

```
Element mess = (Element) XMLdoc.getElementsByTagName("REQUEST");
		String aname = mess.getAttribute("NAME");
		String adtd = mess.getAttribute("DTD");
		InputStream xslmapping = null;
		String service_methode = adtd+aname;
```

Das funktioniert aber nicht.
Ich versucht den StreamSourcewie folgt zu Parsen:

```
XMLdoc = builder.parse(xmlSource);
```
und

```
XMLdoc = (Document) new StreamSource(xmlSource);
```

Das Resultat ist immer das ich eine NullPointerException in der 1. Zeil von CodeTeil A bekomme.
Was halt daran liegt das er das ELEMENT "REQUEST" nicht findet, weil er den StreamSource nicht richtig ins DOCUMENT parst.

Um Hilfe wäre ich sehr Dankbar ,
Gruss
Robson


----------



## Bleiglanz (10. Nov 2004)

> über das XML was ich dort einlese lasse ich nen Mapping drüber laufen.


sprichst du auch Deutsch?
was ist ein "Mapping"?

vermutlich brauchst du sowas wie einen XMLFilter? 

Wahrscheinlich ist dein Problem, dass du nicht "zweimal" die gleiche Streamsource parsen kannst? oder was?


----------



## Robson (10. Nov 2004)

mit Mapping meine ich ein XSLT-Mapping.

Das Programm soll folgendes tun ...
es bekommt ein XML File -> da liest es aus dem REQUEST ELEMENT ein Attribute.
für ein Bestimmtes Attribute soll er ein Bestimmtes XSLT-Mapping laden.

Hier nochmal der Komplette Code um das etwas zu veranschaulichen.


```
public class StyleSheetLoader2 implements StreamTransformation{
	
	public void setParameter (Map param) {}

	public void execute (InputStream in, OutputStream out)
		throws com.sap.aii.mapping.api.StreamTransformationException {

		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		Document XMLdoc = null;
		StreamSource xmlSource = new StreamSource(in);
		
		//InputStream xslMap = this.getClass().getClassLoader().getResourceAsStream("PRECHECK2.xsl");
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
//Hier der Fehler ==> XMLdoc = (Document) new StreamSource(xmlSource);
					//XMLdoc= builder.parse(xmlSource);
		} catch (Throwable t) {
			t.printStackTrace();
		}

		Element mess = (Element) XMLdoc.getElementsByTagName("REQUEST");
		String aname = mess.getAttribute("NAME");
		String adtd = mess.getAttribute("DTD");
		InputStream xslmapping = null;
		String service_methode = adtd+aname;
		
			if (service_methode.equals("ShopDataGetStockInformation")) {			
				xslmapping = this.getClass().getClassLoader().getResourceAsStream("Check_SD_GS.xsl");
			}

		/*		else if (service_methode.equals("<ServiceMethode>")) {						
				xslSource = nthis.getClass().getClassLoader().getResourceAsStream("<xsl Mapping>");
				}
		*/
				else{	
				xslmapping = this.getClass().getClassLoader().getResourceAsStream("ServNotFound.xsl");
				}
		
		try {
			//StreamSource xmlSource = new StreamSource(in);
			StreamSource xslSource = new StreamSource(xslmapping);
			ByteArrayOutputStream pos = new ByteArrayOutputStream();
			StreamResult result = new StreamResult(out);
						
			TransformerFactory tfactory = TransformerFactory.newInstance();
			Templates template = tfactory.newTemplates(xslSource);
			Transformer transformer = template.newTransformer();
			transformer.transform(xmlSource, result);
								
			} catch (TransformerConfigurationException e) {
				e.printStackTrace();
			} catch (TransformerFactoryConfigurationError e) {
				e.printStackTrace();
			} catch (TransformerException e) {
				e.printStackTrace();
		}		
	}
}
```


----------



## Bleiglanz (10. Nov 2004)

OK, der Ansatz schaut vernünftig aus, aber die Zeile

```
XMLdoc = (Document) new StreamSource(xmlSource);
```
ist ja wohl Schrott (eine StreamSource kannst du nicht zu Document casten)

```
XMLdoc = builder.parse(xmlSource);
```
schaut schon besser aus 

```
catch (Throwable t) {
         t.printStackTrace();
```
wer hat dir denn das gelernt? Mach mal lieber eine vernüftige Fehlerbehandlung, fange die richtigen Exceptions (IO? Parse???) und schau z.B. nach, ob xmlSource != null usw.

der Fehler dürfte sein, dass

```
DocumentBuilder builder = factory.newDocumentBuilder();
//Hier der Fehler ==> XMLdoc = (Document) new StreamSource(xmlSource);
               //XMLdoc= builder.parse(xmlSource);
```
in der erste Zeile eine ClassCastException oder sowas fliegt

dein Catch-Block alles verschluckt (und du nicht schaust, wohin der Stacktrace geschrieben wird)

dann wird die Zeile mit dem builder.parse nicht erreicht und XMLDoc ist ==null und es geht nach dem catch einfach weiter

und beim getElementByName fliegt dann die NPE


----------



## Robson (10. Nov 2004)

er schmeisst eine ClassCastException in folgender Zeile 


```
Element reqtag = (Element)XMLdoc.getElementsByTagName("REQUEST");
```

ist da den was faul ? 

wen ich das XMLdoc jetzt so einlese


```
XMLdoc= builder.parse(in);
```

müsste er den Schritt doch machen  ???:L


----------



## Bleiglanz (10. Nov 2004)

weil die Methode getElementsByTagName eine NodeList liefert? 

schau in die API, RTFM


----------



## Robson (10. Nov 2004)

is mir schon klar.

Aber wenn ich ne NodeLost erzeuge, kann ich nicht mit getAttributes den Wert der Attribute in einen String Schreiben.

dan gäbes es noch *getDocumentElement()*, aber da kann ich ihm keinen String mitgeben und er nimmt glaub ich nur das root Element.
Dort sind aber nicht die Attribute die ich brauche, die sind im Element "REQUEST".

wieso gibt es nicht einfach *getElementsByTagName(String)* welches das Ergebnis in ein ELEMENT schreibt.
das ergibt doch keinen Sinn  :autsch: 

Es muss doch möglich sein Ein Attribut eines Bestimmtes Elements in einen String zu schreiben... sowas wird doch ständig gebraucht .. ich kan doch net der einzigste sein der Sowas brauch.


----------



## Bleiglanz (11. Nov 2004)

weil es möglicherweise mehr als ein element mit einem Tagnamen gibt;

wenn du schon vorher weisst, dass es genau eines gibt, dann nimm halt das erste Element der NodeList

Element brauchich = (Element) XMLdoc.getElementsByTagName("REQUEST").item(0);


----------



## Robson (11. Nov 2004)

ahhh ich voll Depp  :autsch: 

Vielen Vielen Dank für deine Mühe   :toll: 

da ist man 2 Tage beschäftigt weil einem ein kleines ".item(0)" fehlt

Gruss
Rob


----------

