JAXB的@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>2019-09-17T16:30: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数据分开。但是如果你自己设计的话你也会做类似的事情。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值