理解JAXB @XmlRootElement注释

15

我正在使用这里的教程来了解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")。
2个回答

24

我建议使用包级别的@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注释上的命名空间属性来覆盖特定元素的命名空间。

了解更多信息


啊,我明白你的意思了...对于一个包含各种XML-to-Java类的包,我必须创建package-info类并根据需要修改上述内容?太棒了!我会研究一下你说的内容,但是我的原始问题呢? :) 我的推断正确吗? - An SO User
@LittleChild - 你将获得一个XML模式,其中de.vogella.xml.jaxb.model是目标命名空间,定义了bookstore元素。问题在于类不会继承@XmlRootElement注释中指定的命名空间,因此它们将生成到另一个XML模式中。 - bdoughan
基本上是因为 elementFormDefault 没有设置为 qualified?噢,模式也将手写。 - An SO User
@LittleChild - 不是的。@XmlRootElement 注解中指定的命名空间只适用于该元素。@XmlType 注解中指定的命名空间参数根据 @XmlSchema 注解中指定的 elementFormDefault 应用于类中的属性。 - bdoughan
我制作了一个JAR文件,以便我可以尝试一些JAXB。所以我首先决定进行验证。但是它没有通过验证。更多信息请参见:http://stackoverflow.com/questions/16615773/sax-parsing-through-a-jar-file-declares-xml-document-invalid - An SO User
显示剩余2条评论

7
  • @XmlRootElement注解可以用于将类或枚举类型映射到XML类型。

  • 当顶级类或枚举类型使用@XmlRootElement注解时,它的值在XML文档中表示为XML元素。

  • 请参照下面的示例以获取更多想法:

将元素与XML模式类型关联

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接