【问题标题】:Understanding JAXB @XmlRootElement annotation理解 JAXB @XmlRootElement 注解
【发布时间】:2013-05-11 04:13:58
【问题描述】:

我使用tutorial here 来理解 JAXB。

当 writer 来创建文档的根目录时,writer 开始如下:

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

【问题讨论】:

    标签: java xml xsd jaxb marshalling


    【解决方案1】:

    我建议使用包级别的@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 并根据需要修改上述内容? 酷!。我会调查你所说的但是我原来的问题呢? :) 我的推断是否正确
    • @LittleChild - 您将获得一个 XML 架构,其中 de.vogella.xml.jaxb.model 作为定义 bookstore 元素的目标命名空间。问题是该类不会继承 @XmlRootElement 注释中指定的命名空间,因此它们会生成另一个 XML 模式。
    • 基本上是因为 elementFormDefault 没有设置为 qualified ?哦,架构也是手写的。
    • @LittleChild - 否。@XmlRootElement 注释上指定的命名空间仅适用于该元素。 @XmlType 注释上指定的命名空间参数适用于基于 @XmlSchema 注释上指定的 elementFormDefault 的类中的属性。
    • 啊,我明白你的意思。只有 <bookstore> 标签将属于 de.vogella.xml.jaxb.model<books> 不会与 @XmlRootElement 。如果我通过电子邮件向您发送我的 XML 和 XSD 并要求您使用它制作 POJO 类,请问这是否太过分了?
    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多