原文地址:[https://jaxb.java.net/tutorial/section_6_2_1-A-Survey-Of-JAXB-Annotations.html#Top-level Elements: XmlRootElement](https://jaxb.java.net/tutorial/section_6_2_1-A-Survey-Of-JAXB-Annotations.html#Top-level Elements: XmlRootElement)
被这个注解的类来描述一个顶层的XML element。比如,一个可以作为一个XML文档的类应当被注解为@XmlRootElement
。它的可选element是name
和namespace
。默认地,类名会被使用作为name
的值。
这个注解对应于一个被用在XML schema最外层的xsd:element
结构。下面的片段展示了这个关系:
@XmlRootElement( name="doc" )
public class Document {
@XmlElement
protected Foo foo;
// ...
}
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<foo>...</foo>
</doc>
<?xml version="1.0" encoding="UTF-8"?>
<xsd:complexType name="Foo">
...
</xsd:complexType>
<xsd:complexType name="Document">
<xsd:sequence>
<xsd:element name="foo" type="Foo"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="doc" type="Document"/>
一个令人惊讶的事实是,如果你所有的Java类都允许直接映射到XML Schema,那么@XmlRootElement
将会是你需要指定的唯一注解。下面是一些类,它们甚至可以排列一个Map<K, V>。
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="doc")
public class DocType {
public Map<KeyType,EntryType> key2entry =
new HashMap<KeyType,EntryType>();
public DocType(){
}
}
import javax.xml.datatype.*;
public class KeyType {
public String event;
public XMLGregorianCalendar datetime;
public KeyType(){}
public KeyType( String event, XMLGregorianCalendar datetime ){
this.event = event;
this.datetime = datetime;
}
}
public class EntryType {
public String program;
public String artists;
public EntryType(){}
public EntryType( String artists, String program ){
this.artists = artists;
this.program = program;
}
}
你会产生如下的XML数据:
<doc>
<key2entry>
<entry>
<key>
<event>Soiree</event>
<datetime>2008-08-23T20:00:00</datetime>
</key>
<value>
<program>Man on the Moon</program>
<artists>R.E.M</artists>
</value>
</entry>
</key2entry>
</doc>
XMLGregorianCalendar
对应于xsd:dateTime
。并且根据Schema Datatypes规范,在date和time之间的“T”是正确的。你可以看到JAXB不得不“发明”了一些tag name来充当中间元素,将众多map entry分开,将key数据和value数据分开。但是如果你自己设计的话你也会做类似的事情。