# Pakete im XSD definieren



## RoNa (30. Okt 2009)

Hallo,

ich habe gehört, man kann in einer XSD-Schema die Paketnamen definieren. Es soll über Namespaces gehen oder so. Ich will aus dem Schema mit Hilfe von JAXB 2 Java-Objekte erzeugen.

Wenn man dann aus den XSDs Java-Objekte mit XJC-ANT-Task erzeugt, werden schon die entsprechenden packages erzeugt.


Stimmt das? Wenn ja, kann mir jemand ein Beispiel oder ein Link geben?

Gruß,

Robert


----------



## musiKk (30. Okt 2009)

Zu faul zum Suchen? Die Stichwörter java, ant und xjc sind nicht schlecht... Da findest Du auch schnell Beispiele, mit denen Du die erste Frage beantworten kannst.


----------



## RoNa (31. Okt 2009)

Zu faul bin ich bestimmt nicht. Ich hab' schon 1/2 Tag gegoogelt. Im Netz findet man vieles und nix. ich habe gehofft, dass jemand schon so etwas gemacht hat und hier posten kann.

Robert


----------



## musiKk (31. Okt 2009)

XJC erzeugt die Packages automatisch aus den Namespaces der Schemata. Erst die Domain umgekehrt, dann der Pfad. Also z. B. [c]example.com/foo/bar[/c] wird zu [c]com.example.foo.bar[/c]. Das ist nicht die ganze Wahrheit, weil manche Zeichen anders ersetzt werden -- z. B. sind in Packagenamen keine Punkte möglich, da diese schon anders belegt sind --, aber die meisten Fälle dürften abgedeckt sein. Namespaces, die keinem URL entsprechen, werden glaube ich einfach so übernommen, den Fall hatte ich erst einmal. Auf der Kommandozeile kann man mit der Option -p den Paketnamen selbst angeben. Eine Beschreibung des ANT-Tasks inklusive Beispielen gibts bei Sun.


----------



## RoNa (31. Okt 2009)

hi, ich benutze JAXB 2.1. Du kannst wohl den Paketnamen mi '-p' oder in ANT mit Attribut 'package' wie auf https://jaxb.dev.java.net/2.1.6/docs/xjcTask.html Bei uns müssen aber 140 Objekte erzeugt werden. Da wollten wir nicht dasANT-Script immer anpassen, obwohl es geht mit Sicherheit auch, sondern das package sollte aus dem XSD kommen.

Hast Du vielleicht ein Beispiel mit so einem Namespace?

Robert


----------



## Wildcard (31. Okt 2009)

Um mal eine Alternative in den Raum zu werfen: EMF ist wesentlich mächtiger als JaxB. Die package namen werden ebenfalls aus den Namespaces des XSD abgeleitet, können aber auch einfach im EMF Editor angepasst werden.


----------



## musiKk (31. Okt 2009)

Das hat ja gedauert... länger als einen Tag.


----------



## RoNa (1. Nov 2009)

Wie sind aber auf JAXB angewiesen. JAXB ist direkt in jersey https://jersey.dev.java.net/ integriert. Das nutzen wir.

Hätte jemand ein einfaches Beispiel?


----------



## musiKk (1. Nov 2009)

Ich weiß jetzt nicht genau, was Du wissen willst. Zumindest meine ich herausgelesen zu haben, dass ihr schon ein Schema habt. Wenn auf ein solches der XJC angewendet wird (ob auf der Kommandozeile oder per ANT sollte eigentlich egal sein), dann werden automatisch Packages entsprechend der involvierten Namespaces erstellt. Wenn ein anderer gewünscht wird, muss der manuell angegeben werden.
Was meinst Du mit 140 Objekten? Sind das 140 Schema-Elemente? Liegen die alle im gleichen Namespace? In der gleichen Schema-Datei? Dann kommen sie auch ins gleiche Package, egal ob generiert oder manuell angegeben.


----------



## RoNa (1. Nov 2009)

Es sind 140 Objekte, die mit JAXB in Java überführt werden müssen. Es sind ca. 140 XSD-Dateien. Die funktionieren aer nicht. Die Packages werden nicht erstellt. Deswegen wollte ich ein lauffähiges Beispiel haben und mir das abgucken ;-) Im Beispiel kann ein Fantasie-Objekt im package definiert sein. Es sollte mit ANT-XJC überführt werden. Dabei will ich das Attribut 'packge' nicht benutzen. Die Pakete sollen aus dem XSD kommen.

Wie schon geschrieben: im Netzt wird man zu diesem Thema mit Informationen erschlagen. Aber die Beispiele gehen nicht ;-)

Robert


----------



## musiKk (1. Nov 2009)

Naja gut, mal ein Beispiel.
[xml]
<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.example.com/foo/bar" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.com/foo/bar">
    <element name="foo" type="string"></element>
</schema>
[/xml]
Darauf XJC angewendet [c]xjc -d . myschema.xsd[/c] und es wird die Klasse [c]com.example.foo.bar.ObjectFactory[/c] erzeugt. Wären da noch Typen drin, wären die natürlich ebenso erzeugt worden, aber für ein Minimalbeispiel sollte das reichen.


----------



## RoNa (2. Nov 2009)

Danke es funtzt ;-)

Ich habe nun bisschen rumexperimentiert und andere Objekte eingebaut.

```
<?xml version="1.0" encoding="UTF-8"?>	
<schema targetNamespace="http://mycompany.de/produkt/kraftfahrt"
	elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:Q1="http://mycompany.de/produkt/kraftfahrt">
	<complexType name="Person">    
        <sequence>
        	<element name="name" type="string" />
        	<element name="alter" type="int" />
        	<element name="beamter" type="boolean" />
        	<!-- Hier wird ein definiertes Objekt benutzt -->
        	<element name="auto" type="Q1:Auto"/>
        </sequence>
	</complexType>
	<complexType name="Auto">
		<sequence>
			<element name="PS" type="int"/>
			<element name="Sportwagen" type="boolean"/>
		</sequence>
	</complexType>
</schema>
```

Nun möchte ich noch Objekte im Schema vererben lassen. Es geht wohl mit 'extensions'

Ganz geheuer ist mir die Geschichte aber nicht. ;-)

Robert


----------



## musiKk (2. Nov 2009)

Ich würde die Schemata nicht von Hand erstellen. Es gibt einen Schema-Editor für Eclipse, der ist nicht perfekt, aber ziemlich gut. Hierarchien habe ich noch nie gemacht, aber das scheint damit recht einfach zu gehen.


----------



## RoNa (2. Nov 2009)

Ich habe die Erfahrung gemacht, dass bevor man einen Editor oder Wizzard benutzt, sollte man den Code verstehen. Klar, später wird man die Sachen nicht manuelle erstellen.


----------

