# Unmarshal JAXB



## evil_one (24. Okt 2007)

Hallo,

ich habe ein XML Schema das für verschiede XML Dateien steht.
Im Klartext: Die XSD steht für verschiedene Nachrichten Typen.
Zum Beispiel:


Nachricht von Kunde zum Händler
Nachricht von Händler zum Kunde

um nur 2 zu nennen.

Diese Nachrichten liegen nun in Form einer XML Datei in einem Verzeichnis.

Ich möchte nun jede Datei durchgehen und jede Datei in einen Objektbaum umwandeln.

Ich habe mir aus der XSD auch schon die Java Klassen gebaut.

1. Klasse NachrichtvonKundezumHaendler
2. Klasse NachrichtvonHaendlerzumKunde

Jetzt mein Problem beim Unmarshalling

Folgendes geht Ohne Probleme:

```
NachrichtvonKundezumHaendler nvkzh = (NachrichtvonKundezumHaendler) u.unmarshal(new File("20071011.xml"));
```

Und dies hier führt zur ClassCastException

```
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
Object o = u.unmarshal( new File( "nosferatu.xml" ) );
```

Ich weiß doch aber vorher nicht was für ein Objekt ich erzeugen möchte. So kann ich im Quellcode auch nicht festlegen was für ein Objekt erzeugt werden soll.

Kann mir jemand sagen wie ich das allgemeingültig schreiben kann?


----------



## Niki (31. Okt 2007)

Hast du unterschiedliche Schemata für die XML-Dateien, oder wird immer das selbe Objekt erzeugt?


----------



## Murray (31. Okt 2007)

evil_one hat gesagt.:
			
		

> Und dies hier führt zur ClassCastException
> 
> ```
> JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
> ...


Zeigt mal den StackTrace der Exception zusammen mit den betr. Codezeilen,


----------



## evil_one (12. Nov 2007)

@niki: es handelt sich um eine Schemata... Hier die Infos zum Schema

@Murray: Mein geposteter Code bringt natürlich keine ClassCastException habe ich jetzt gesehen, da ich ja den Unmarshaller in ein Objekt vom Typ Object schreibe.
Nur die Umwandlung vom Objekt in die entsprechende KLasse geht halt net.

Ich weiß ich antworte spät. Wäre schön wenn ihr trotzdem mal drüber schauen könntet.


----------



## Niki (12. Nov 2007)

Gib dir mal den Typ aus den du zurück bekommst. getClass().getName()....
Dann caste es mal auf diese Typ und schau dir die Methoden an die du hast. Bei JAXB musst du glaub ich einen Zwischenschritt machen. Du bekommst ein JAXBElement glaub ich zurück. Auf dieses Objekt kannst du dann getValue() aufrufen. Dieses sollte dann genau das Element sein, welches du willst!


----------



## evil_one (12. Nov 2007)

Ja ok das stimmt schon...
Ich kann mir ja ausgeben lassen was es für ein Typ ist.

nur es ist ja jedes mal ein anderer nachrichten typ.

Wie gehe ich dann beim casten vor?


----------



## Niki (12. Nov 2007)

Wie soll das ein anderer Typ sein wenn du nur ein Schema hast. Das Oberste Element musst du ja immer auf das selbe Objekt casten können. Das Root-Element muss das gleiche bleiben, das geht ja sonst gar nicht, da du ja sonst eine ParseException bekommen würdest. Wenn du das Root Element hast musst dich halt mit diversen Abfragen durch die Objekte durcharbeiten.


----------

