# Unmarshall Probleme



## FlorianK (15. Jan 2007)

Hallo,
ich habe aus meiner XSD-Datei meine Klassen generiert und kann mein Klassen auch mit dem Marshall füllen.
Jedoch, wenn ich die Daten aus den Klassen in ein XML transformieren möchte, bekomm ich folgenden Fehler:

```
Exception in thread "main" java.lang.ClassCastException: javax.xml.bind.JAXBElement cannot be cast to de.beispiel.KatalogTyp
	at de.beispiel.JAXBExample.unmarshall(JAXBExample.java:51)
	at de.beispiel.JAXBExample.main(JAXBExample.java:17)
```

Woran kann das liegen?
Ich habe meine Klasse mit dem Schema erstellt und konnt es auch befüllen...
Ich habe auch schon gegooglt, jedoch konnte ich keine Lösung finden :/

Gruß,
Florian


----------



## FlorianK (15. Jan 2007)

Sry, hatte meine Dateien vergessen anzuhängen:

JAXBExample:

```
package de.beispiel;

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class JAXBExample {
	
	public static void main(String[] args) throws Exception {
		// Java -> XML
		//marshall();
		
		// XML -> Java 
		unmarshall();
	}

	public static void marshall() throws Exception {
		ObjectFactory obj = new ObjectFactory();
		KatalogTyp katalog = obj.createKatalogTyp();
		katalog.setPasswort("passwort");
			ThemaTyp thema = obj.createThemaTyp();
			thema.setIndex(1);
			thema.setName("Kassenpruefung");
				KategorieTyp kategorie = obj.createKategorieTyp();
				kategorie.setIndex(1);
				kategorie.setName("Zahlungsverkehr");
					UnterkategorieTyp unterkategorie = obj.createUnterkategorieTyp();
					unterkategorie.setIndex(1);
					unterkategorie.setName("Bargeld");
						EintragTyp eintrag = obj.createEintragTyp();
							eintrag.setIndex(1);
							eintrag.getFrageAndVorschriftAndAntwort().add(new ObjectFactory().createEintragTypFrage("Frage 1"));
							eintrag.getFrageAndVorschriftAndAntwort().add(new ObjectFactory().createEintragTypVorschrift("Vorschrift 1"));
							eintrag.getFrageAndVorschriftAndAntwort().add(new ObjectFactory().createEintragTypVorschrift("Vorschrift 2"));
							eintrag.getFrageAndVorschriftAndAntwort().add(new ObjectFactory().createEintragTypAntwort("Antwort"));
					unterkategorie.getEintrag().add(eintrag);
				kategorie.getUnterkategorie().add(unterkategorie);
			thema.getKategorie().add(kategorie);
		katalog.getThema().add(thema);	
		
		Marshaller marshaller = JAXBContext.newInstance("de.beispiel").createMarshaller();
		marshaller.marshal(katalog, System.out);
	}
	
    public static void unmarshall() throws Exception {  
    	String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><ns2:Pruefungskatalog xmlns:ns2=\"http://10.196.150.5/WebSVN/xml/Pruefungskatalog\" Passwort=\"passwort\" Erstellungsdatum=\"2007-01.15\"><Thema Name=\"Kassenpruefung\" Index=\"1\"><Kategorie Name=\"Zahlungsverkehr\" Index=\"1\"><Unterkategorie Name=\"Bargeld\" Index=\"1\"><Eintrag Index=\"1\"><Frage>Frage 1</Frage><Vorschrift>Vorschrift 1</Vorschrift><Vorschrift>Vorschrift 2</Vorschrift><Antwort>Antwort</Antwort></Eintrag></Unterkategorie></Kategorie></Thema></ns2:Pruefungskatalog>";        
    	Unmarshaller unmarshaller = JAXBContext.newInstance("de.beispiel").createUnmarshaller();
    	KatalogTyp katalog = (KatalogTyp) unmarshaller.unmarshal(new StringReader(xml));  
//	    System.err.println(unmarshaller.unmarshal(new StringReader(xml)).getClass().getName()); 

    	System.out.println(katalog);  
    }

}
```


----------



## SlaterB (15. Jan 2007)

ich frage mich wie du bei google suchst..

http://www.google.de/search?hl=de&q...lement+cannot+be+cast&btnG=Google-Suche&meta=
-> erster Link:
http://forum.java.sun.com/thread.jspa?threadID=748615&messageID=4283186
(keine Ahnung ob der hilft  )


----------



## FlorianK (16. Jan 2007)

Den Link kannte ich auch schon...
Ich bekomm aber immer noch einen Fehler:


```
Cannot cast from JAXBElement to KatalogTyp
```

Hier mein Code:

```
KatalogTyp katalog = (KatalogTyp) ((JAXBElement)unmarshaller.unmarshal(new StringReader(xml)));
```


----------



## SlaterB (16. Jan 2007)

im der gelinkten Lösung steht doch deutlich 

-------
So, try this:

JAXBContext jc = JAXBContext.newInstance("Resource");
Unmarshaller u = jc.createUnmarshaller();
MyResType res =
(MyResType) ((JAXBElement) u.unmarshal(new FileInputStream("foo.xml"))).getValue();
----------

.GETVALUE()!!!

ich verstehe ja überhaupt nicht worum's bei dem ganzen geht,
und du scheinst auch nicht darüber sprechen zu wollen ('kenne ich schon..')
aber vielleich das übersehen? 

--------

KatalogTyp katalog = (KatalogTyp) ((JAXBElement)unmarshaller.unmarshal(new StringReader(xml)));

so wie es im Moment da steht macht das keinen Sinn,
wozu auf JAXBElement casten und direkt danach auf KatalogTyp?


----------



## byte (17. Jan 2007)

http://de.wikipedia.org/wiki/JAXB


----------

