Java 理解JAXB@XmlRootElement注释

Java 理解JAXB@XmlRootElement注释,java,xml,xsd,jaxb,marshalling,Java,Xml,Xsd,Jaxb,Marshalling,我正在使用JAXB来理解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 { ... } 虽然我将手动生成我的类,而不是让Eclips

我正在使用JAXB来理解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;
覆盖命名空间

// 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>
  • 您可以使用
    @XmlType
    注释为类中的所有属性重写
    @XmlSchema
    中给定的命名空间
  • 您可以使用
    @XmlRootElement
    @XmlElement
    注释上的namespace属性覆盖给定元素的名称空间
了解更多信息

      • @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>
      
      //示例:代码片段
      @XmlRootElement
      类点{
      int x;
      int-y;
      点(int x,int y){x=x;y=y;}
      }
      //示例:对应于XML输出的代码片段
      元帅(新点(3,5),系统输出);
      3.
      5.
      
      啊,我明白你的意思。。。。对于包含各种XML到Java类的包,我必须创建class
      package info
      ,并根据需要修改上述内容?酷!。我会调查你说的话,但我原来的问题呢这是我的推论correct@LittleChild-您将获得一个XML模式,其中包含
      de.vogella.XML.jaxb.model
      作为定义
      bookstore
      元素的目标命名空间。问题是类不会继承
      @XmlRootElement
      注释中指定的名称空间,因此它们将生成另一个XML架构。基本上是因为
      elementFormDefault
      未设置为
      限定的
      ?哦,架构也将是手工编写的。@LittleChild-否。
      @XmlRootElement
      注释中指定的名称空间仅适用于该元素。在
      @XmlType
      注释中指定的名称空间参数基于在
      @XmlSchema
      注释中指定的elementFormDefault应用于类中的属性。啊,我明白你的意思了。只有
      标记将属于
      de.vogella.xml.jaxb.model
      将不属于
      @XmlRootElement
      。如果我通过电子邮件向您发送了我的XML和XSD,并要求您使用它制作POJO类,这会不会太过分?