2013-05-16 3 views
11

Ich verwende die tutorial here zum Verständnis von JAXB.Verständnis JAXB @ XmlRootElement Annotation

Wenn der Schreiber kommt die Wurzel des Dokuments zu erstellen, beginnt der Autor wie folgt:

//This statement means that class "Bookstore.java" is the root-element of our example 
@XmlRootElement(namespace = "de.vogella.xml.jaxb.model") 
public class Bookstore { 
     ... 
} 

Obwohl ich meine Klassen zu erzeugen wird manuell lassen, anstatt von Eclipse es tun, werde ich eine XSD liefern mit Meine JAR-Datei (nicht im Inneren, sondern im JAR-Ordner), damit beim Start der Anwendung überprüft wird, ob das XML-Dokument manipuliert wurde.

Also, in der XSD-Datei, wird die targetNamespacede.vogella.xml.jaxb.model sein, weil es oben als @XmlRootElement(namespace = "de.vogella.xml.jaxb.model") erklärt wurde?

Antwort

20

Ich empfehle die Verwendung der Package-Ebene @XmlSchema Annotation, um die Namespace-Qualifikation für Ihr Modell anzugeben. Eine Annotation auf Paketebene wird in eine spezielle Klasse namens package-info geschrieben, die den genauen Inhalt enthält, wie unten gezeigt. Diese Annotation bedeutet, dass alle Elemente in Ihrem Dokument ohne einen angegebenen expliziten Namespace diesen Namespace verwenden.

org/example/foo/package-info.java

@XmlSchema(
    namespace = "http://www.example.org/foo", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package org.example.foo; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

Aufschalten der Namespace

  • können Sie den Namespace in der @XmlSchema in einer Klasse für alle Eigenschaften außer Kraft setzen Verwenden Sie die @XmlType Annotation.
  • Sie können den Namespace für ein bestimmtes Element mithilfe der Namespace-Eigenschaft für die Annotation @XmlRootElement oder @XmlElement überschreiben.

Weitere Informationen

+0

Ah ich verstehe, was Sie sagen .... für eine Paket, das die verschiedenen XML-zu-Java-Klassen enthält, muss ich die Klasse 'package-info' erstellen und den obigen Inhalt nach Bedarf ändern? **Cool!**. Ich werde schauen, was du gesagt hast ** aber ** was ist mit meiner ursprünglichen Frage?:) War meine Inferenz korrekt? –

+0

@LittleChild - Sie erhalten ein XML-Schema mit dem Namen 'de.vogella.xml.jaxb.model' als Ziel-Namespace, der das' bookstore' Element definiert. Das Problem besteht darin, dass die Klasse den in der Annotation "@ XmlRootElement" angegebenen Namespace nicht übernimmt, sodass sie in ein anderes XML-Schema generiert würden. –

+0

grundsätzlich, weil 'elementFormDefault' nicht auf' qualifiziert' gesetzt ist? und oh, Schema wird auch von Hand geschrieben werden. –

2
  • @XmlRootElement Anmerkung kann verwendet werden, um eine Klasse oder Aufzählungstyp XML-Typ zuordnen.

  • Wenn eine Klasse der obersten Ebene oder ein Aufzählungstyp mit der Annotation @XmlRootElement kommentiert wird, wird ihr Wert als XML-Element in einem XML-Dokument dargestellt.

  • das Beispiel weiter unten folgen weitere Vorstellung zu bekommen:

Mitarbeiter ein Element mit XML-Schema-Typ

// Example: Code fragment 
@XmlRootElement 
class Point { 
    int x; 
    int y; 
    Point(int _x,int _y) {x=_x;y=_y;} 
} 

//Example: Code fragment corresponding to XML output 
marshal(new Point(3,5), System.out); 


<!-- Example: XML output --> 
<point> 
    <x> 3 </x> 
    <y> 5 </y> 
</point>