2013-05-16 89 views
11

我正在使用tutorial here來了解JAXB。瞭解JAXB @XmlRootElement註釋

當作家來創建文檔的根源,筆者開始如下:

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

雖然我將手動生成我的課,而不是讓Eclipse中做到這一點,我會提供一個XSD與我的jar文件(不是打包在內部,而是包含在包含jar文件的文件夾中),這樣當我的應用程序啓動時,它將驗證XML文檔是否被篡改。

那麼,在XSD文件中,targetNamespace將爲de.vogella.xml.jaxb.model,因爲它在上面被聲明爲@XmlRootElement(namespace = "de.vogella.xml.jaxb.model")

回答

20

我建議使用包級別@XmlSchema註釋來指定模型的名稱空間限定。一個包級別註釋放在一個名爲package-info的特殊類中,其中包含如下所示的確切內容。該註釋將意味着文檔中沒有給定顯式名稱空間的所有元素都將使用該名稱空間。

組織/例子/富/ 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; 

重寫命名空間

  • 您可以覆蓋在@XmlSchema爲類中的所有屬性給出的命名空間使用@XmlType註釋。
  • 您可以使用@XmlRootElement@XmlElement批註中的名稱空間屬性覆蓋給定元素的名稱空間。

更多信息

+0

啊元素我明白你在說什麼....一包含各種XML-to-Java類的包,我必須創建類'package-info'並根據需要修改上述內容? **涼!**。我會研究你說的**但是**我原來的問題呢?:)我的推論是否正確 –

+0

@LittleChild - 您將得到一個XML模式,其中有'de.vogella.xml.jaxb.model'作爲定義'bookstore'元素的目標名稱空間。問題在於該類不會繼承'@ XmlRootElement'註釋中指定的名稱空間,因此它們將生成另一個XML模式。 –

+0

基本上是因爲'elementFormDefault'沒有設置爲'qualified'?哦,模式也將被手寫。 –

2
  • @XmlRootElement註解可以用於映射類或枚舉類型到XML類型。

  • 當使用@XmlRootElement批註對頂級類或枚舉類型進行批註時,它的值在XML文檔中表示爲XML元素。

  • 按照下面給出的例子,以獲得更多的想法:

助理與XML Schema類型

// 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>