Pakete im XSD definieren

Status
Nicht offen für weitere Antworten.

RoNa

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
Danke es funtzt ;-)

Ich habe nun bisschen rumexperimentiert und andere Objekte eingebaut.
Java:
<?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

Top Contributor
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

Bekanntes Mitglied
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben