初窥JAXB

概念

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。

示例:将xml文件转换为java类。如下图:


说明:

(1): XSD文件是通过另外一套语法规则定义的文件,个人认为可以使用工具生成。这里我用的是Altova XMLSpy(工具多种多样)

(2): 使用xjc命令将XSD文件转换为Java Bean

现在,给出示例一的完整版。

首先,需要一个XML文件描述我们的实体类,它的样子看起来如下:

<?xmlversion="1.0" encoding="UTF-8"?>

<UserInfo id="123" userName="yanan" passWord="123456">

         <Role id="1" roleName="管理员"description="超级权限"></Role>

</UserInfo>

 

然后使用工具生成XSD文件:

(1):选择“DTD模式”

(2):选择“W3C模式”,点击确定。如下图:



 

生成之后,剩下的工作就是使用xjc命令生成java类了,语法如下:

xjc[-xmlschema|-dtd] [–d 保存java文件的目录] [–pjava文件所在的包] <编译文件>

-xmlschema 指定编译文件的格式为Schema格式,此参数是默认值,可以不用提供。
                    如果不提供此参数,编译文件必须是Schema文件。
-dtd  指定编译文件的格式为DTD格式,如果编译文件是DTD文件则必须提供此参数。
-d  指定了保存java文件的目录
-p  指定了生成的java文件所在的包

按照上边的命令,即可生成java类了

UserInfo.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "role"
})
@XmlRootElement(name = "UserInfo")
public class UserInfo {

    @XmlElement(name = "Role", required = true)
    protected Role role;
    @XmlAttribute(required = true)
    protected String userName;
    @XmlAttribute(required = true)
    protected int passWord;
    @XmlAttribute(required = true)
    protected byte id;

    public Role getRole() {
        return role;
    }
    public void setRole(Role value) {
        this.role = value;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String value) {
        this.userName = value;
    }
    public int getPassWord() {
        return passWord;
    }
    public void setPassWord(int value) {
        this.passWord = value;
    }
    public byte getId() {
        return id;
    }

    public void setId(byte value) {
        this.id = value;
    }

}





Role,java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;



@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "Role")
public class Role {

    @XmlAttribute(required = true)
    protected String roleName;
    @XmlAttribute(required = true)
    protected byte id;
    @XmlAttribute(required = true)
    protected String description;

    
    public String getRoleName() {
        return roleName;
    }

    
    public void setRoleName(String value) {
        this.roleName = value;
    }

 
    public byte getId() {
        return id;
    }

    
    public void setId(byte value) {
        this.id = value;
    }

   
    public String getDescription() {
        return description;
    }

   
    public void setDescription(String value) {
        this.description = value;
    }

}

ObjectFactoy.java

 import javax.xml.bind.annotation.XmlRegistry;

@XmlRegistry
public class ObjectFactory {
    public ObjectFactory() {
    }

    public Role createRole() {
        return new Role();
    }
    public UserInfo createUserInfo() {
        return new UserInfo();
    }

}

 



 

JAXB常用操作

       涉及到java类与xml操作的接口都在javax.xml.bind包下,频繁的操作无非编组和解组。所谓编组就是将 Java 内容树序列化回 XML 数据的过程;所谓解组就是将 XML 数据反序列化为新创建的Java 内容树的过程。这里面有三个类需要熟悉:一个是JAXBContext,一个是Unmarshaller还有Marshaller

              针对上面示例所产生的Java Class,我们可以进行以下操作:

       public static void main(String[]args) throws FileNotFoundException{  

              marshal(new FileOutputStream("out.xml"));

              unmarshal(new File("out.xml"));  

       }  

 

       /**

        * 解组

        * @param file需要解组的文件

        */

       private static void unmarshal(File file) { 

              Class[] classes={UserInfo.class,Role.class};

              JAXBContext jc;

              try {

 

                     jc = JAXBContext.newInstance(classes,null);

                     Unmarshaller u =jc.createUnmarshaller();

                     //解组

                     UserInfo fooObj =(UserInfo)u.unmarshal(file);

                     System.out.println("用户名:"+fooObj.getUserName()+

                                   "\n"+"密码:"+fooObj.getPassWord()+

                                   "\n"+"角色名称:"+fooObj.getRole().getRoleName());

 

              } catch (JAXBException e) {

                     e.printStackTrace();

              }

       }  

       /**

        * 编组:将 Java 内容树序列化回 XML 数据的过程

        * @param output

        */

       private static void marshal(OutputStream output) {

              ObjectFactory obj=new ObjectFactory();

              Class[] classes={UserInfo.class,Role.class};

              //实例化用户、角色对象;并赋值

              UserInfo userInfo =obj.createUserInfo();

              Role role=obj.createRole();

              role.setId((byte)2);

              role.setRoleName("管理员...");

              role.setDescription("超级权限...");

              userInfo.setId((byte)123321);

              userInfo.setUserName("andy");

              userInfo.setPassWord((byte)123456);

              userInfo.setRole(role);

              try {  

                     JAXBContext jc=JAXBContext.newInstance(classes,null);

                     Marshaller m=jc.createMarshaller();

                     //编组

                     m.marshal(userInfo,output);

              } catch(Exception e){

                     e.printStackTrace();

              }

              finally {  

                     try {  

                            output.close();   

                     } catch (IOException e) {  

                     }  

              }  

}

常见的操作就这些了,对于相关类的用法可以参考API。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值