美文网首页
JAXB的@XmlRootElement注解

JAXB的@XmlRootElement注解

作者: JohnShen | 来源:发表于2016-01-14 17:14 被阅读6721次

    原文地址:[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是namenamespace。默认地,类名会被使用作为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数据分开。但是如果你自己设计的话你也会做类似的事情。

    相关文章

      网友评论

          本文标题:JAXB的@XmlRootElement注解

          本文链接:https://www.haomeiwen.com/subject/mmqhkttx.html