我在这里使用教程来理解JAXB。
当编写者开始创建文档的根目录时,编写者开始如下:
//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生成,但我将提供一个包含jar文件的XSD
(不是打包在里面,而是放在包含jar文件的文件夹中),以便在应用程序启动时验证XML文档是否已被篡改。
因此,在XSD文件中,targetNamespace
将是de.vogella.xml.jaxb.model
,因为它在上面声明为@XmlRootElement(namespace = "de.vogella.xml.jaxb.model")
?
我建议使用包级@XmlSchema
注释为您的模型指定名称空间限定。包级别的注释位于一个名为package-info
的特殊类中,该类包含如下所示的确切内容。该注释将意味着文档中没有明确指定名称空间的所有元素都将使用该名称空间。
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;
覆盖命名空间
- 您可以使用
@XmlType
注释覆盖@XmlSchema
中给定的类中所有属性的命名空间。 - 可以使用
@XmlRootElement
或@XmlElement
注释上的namespace属性覆盖给定元素的命名空间。
查看更多信息
- http://blog.bdoughan.com/2010/08/jaxb-namespaces.html
- http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html
-
@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>