原文地址:[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)
被這個(gè)注解的類來描述一個(gè)頂層的XML element。比如,一個(gè)可以作為一個(gè)XML文檔的類應(yīng)當(dāng)被注解為@XmlRootElement。它的可選element是name和namespace。默認(rèn)地,類名會(huì)被使用作為name的值。
這個(gè)注解對(duì)應(yīng)于一個(gè)被用在XML schema最外層的xsd:element結(jié)構(gòu)。下面的片段展示了這個(gè)關(guān)系:
@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"/>
一個(gè)令人驚訝的事實(shí)是,如果你所有的Java類都允許直接映射到XML Schema,那么@XmlRootElement將會(huì)是你需要指定的唯一注解。下面是一些類,它們甚至可以排列一個(gè)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;
}
}
你會(huì)產(chǎn)生如下的XML數(shù)據(jù):
<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對(duì)應(yīng)于xsd:dateTime。并且根據(jù)Schema Datatypes規(guī)范,在date和time之間的“T”是正確的。你可以看到JAXB不得不“發(fā)明”了一些tag name來充當(dāng)中間元素,將眾多map entry分開,將key數(shù)據(jù)和value數(shù)據(jù)分開。但是如果你自己設(shè)計(jì)的話你也會(huì)做類似的事情。