# Marshaling eines JAXB Objektes worin ein anderes JAXB Objekt eingeschlossen ist



## freaksta (14. Mai 2009)

Hallo zusammen!

Ich habe gerade ein (wie ich finde) gar nicht sooo untypisches Problem.

Ich arbeite im Moment in einem Projekt, was die neue Anfragesprache MPEG Query Format (MPQF) benutzt. Diese dient dazu, Anfragen an Datenbanken zu stellen, um Multimedia Daten zu erhalten. Dabei gibt es einen Query Typ, der es erlaubt x-beliebige Metadaten Standards (Dublin Core, MPEG-7,...) sofern XML basiert anzusprechen.

Und da sind wir nun auch schon beim Problem! Ich habe nun quasi mittels JAXB aus dem MPQF XSD meine Objekte erzeugt. In einem ersten Schritt wird die Query aufgebaut bis zu dem Punkt wo (nehmen wir mal für dieses Beispiel so an) die MPEG-7 Beschreibung eingesetzt werden soll.

Ihr seht das Problem. Ich habe 2 verschiedene JAXB Kontexte. Es ist nicht möglich die Schemen zu ändern, da es dann nicht mehr standardkonform bleibt. Ok, mein erster Gedanke war, kein Problem, mache ich aus MPEG-7 einen String und Stecke den in das MPQF Objekt. Nur dumm, dass JAXB dann alles escaped...

...hat einer einen Rat wie ich dieses Problem lösen kann?


----------



## Noctarius (14. Mai 2009)

Kann man JAXB nicht mehrere "Basispackages" mitgeben beim initialisieren des Kontextes? Dann müsste es gehen, wenn die Namespaces sauber hinterlegt sind.



> The client application must supply a context path which is a list of colon (':',  separated java package names that contain schema derived classes. The JAXB provider will ensure that each package on the context path has a jaxb.properties file which contains a value for the javax.xml.bind.context.factory property and that all values resolve to the same provider.



JAXBContext (Java(TM) Web Services Developer Pack (Version 1.6)))


----------



## freaksta (15. Mai 2009)

Wie heißts doch so schön...wer lesen kann ist klar im Vorteil 

Vielen Dank für den nützlichen Tip! Damit sollte sich das Problem in Wohlgefallen auflösen


----------



## Noctarius (15. Mai 2009)

Klappt es denn?  (ich habs noch nie gemacht, deswegen die Frage *gg*)


----------



## freaksta (18. Mai 2009)

Ja soweit klappt das alles...leider ist das was rauskommt nicht mehr zum ausgangsschema valide...ich habe nun das Problem, dass ich noch eine 2. JAXB_Schema_Location setzen müsste im XML Dokument.

Das erste setze ich wie folgt:


```
m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "urn:mpeg:mpqf:schema:2008 mpqf_semantic_enhancement.xsd");
```

Allerdings habe ich ja nur einen Marshaller...ein zweiter wäre ja auch Blödsinn...hmhm...

Gibt es irgendeine Möglichkeit in irgendeinem Element noch eine andere SchemaLocation zu erzeugen später im Dokument? Das ist jetzt nur noch der einzige Knackpunkt 

Hier ein Auszug der XML wie sie aussehen sollte:


```
<ns3:MpegQuery xmlns:ns2="urn:DICOM:schema:2009" xmlns:ns3="urn:mpeg:mpqf:schema:2008" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:mpqf:schema:2008 mpqf_semantic_enhancement.xsd" mpqfID="001">
	<ns3:Query>
		<ns3:Input>
			<ns3:QueryCondition>
				<ns3:Condition xsi:type="ns3:QueryByDescription" matchType="exact">
					<ns3:DescriptionResource resourceID="ID_1">
						<ns3:AnyDescription xsi:schemaLocation="urn:DICOM:schema:2009 DICOM_1_0_valid.xsd">
							<ns2:DICOM>
..........
```


----------



## freaksta (18. Mai 2009)

ok, die sachlage war denkbar einfach...in der xml schema location kann man einfach sone art liste machen (namespace schema paare) dann passt das scheinbar...das wusste ich auch nicht...

problem gelöst, prima


----------



## Noctarius (18. Mai 2009)

Hört sich gut an, dann weiß ich das auch schon mal


----------

