zoukankan      html  css  js  c++  java
  • JAXB的介绍(转载)

    < xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

    一、前言。
        最近正在做一个项目,根据需求计划需要一种 Object <--> XML的工具,而JAXB就非常符合需求,于是以下是近天来的研究心得。

    二、JAXB技术介绍

    1.         什么是JAXB
        Java  Architecture for XML Binding (JAXB) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
        这意味着你不需要处理甚至不需要知道XML编程技巧就能在Java应用程序中利用平台核心XML数据的灵活性。而且,可以充分利用XML的优势而不用依赖于复杂的XML处理模型如SAXDOMJAXB 隐藏了细节并且取消了SAXDOM中没用的关系——生成的JAXB类仅描述原始模型中定义的关系。其结果是结合了高度可移植Java代码和高度可移植的XML数据。其中这些代码可用来创建灵活、轻便的应用程序和Web服务。

    2.         JAXB的体系结构
    JAXB学习 - mengshj - 可可的梦幻世界

    JAXB的体系结构和应用过程如图所示,一般来说包含以下几个步骤:

    1)        根据你的应用程序所要操作的XML数据格式,撰写相应的XML Schema,有关XML Schema的知识,请参阅“参考资料

    2)        使用JAXB 所带的编译工具(Binding Compiler),将这个XML Schema文件作为输入,产生一系列相关的Java ClassInterface

    3)        在使用JAXB编译工具的时候,可以有选择性的提供一个配置文件(图的虚线部分),来控制JAXB编译工具的一些高级属性。

    4)        这些Java ClassInterface是你的应用程序操纵XML数据的主要接口和方法。

    5)        通过JAXBXML文档进行的操作主要包括:将符合XML Schema规定的XML文档解析生成一组相应的Java对象;对这些对象进行操作(修改、增加和删除对象的属性等等);然后将这些对象的内容保存到这个XML文档中。

    三、安装介绍

    1.         开发环境准备

    1)        Java 1.5 JDK/JRE
    (*) 
    你必须安装java运行环境

    2)        Eclipse SDK 3.2.x
    Eclipse
    推荐下载的版本是< xmlnamespace prefix ="st1" ns ="urn:schemas-microsoft-com:office:smarttags" />3.2.1 

    3)        My Eclipse 5.x  (推荐使用)
    能为你的XML编写提供帮助,与Eclipse SDK 3.2.x配套使用。

    2.         开始安装:

    1)        需要下载的软件

    A.        下载开发工具包:Java Web Services Developer Pack 2.0
        JAXB2.0
    的正式版本的一个实现(大家一定要记住,JAXB只是一个标准,Sun公司提供的此工具包只能说是这个标准的一个实现)已经发布了。由于XMLWeb Services中的大量应用,所以,JAXB2.0作为Web Services开发包的一部分,可以从SUN的官方网站下载。其中jaxb包含在jaxb子目录下。

    B.        XML文档解析:xerces-2_9_0
        Xerces
    是由Apache组织所推动的一项XML文档解析开源项目,jwsdp提供的xerces似乎有Bug,建议下载最新版本,下载请到Apache的官方网站下载

    2)        环境变量配置
        要使用JAXB,在下载JAXB开发包以后,还要设置一些环境变量,主要是设置classpath的路径,以提供JAXB包所带的库文件的位置。
    < xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />

    JAVA_HOME=D:\java\jdk1.5.0

    JWSDP_HOME=D:\Sun\jwsdp-2.0

    JAXB_HOME=%JWSDP_HOME%\jaxb

    JAXB_LIBS=%JAXB_HOME%\lib

    JAXP_LIBS=%JWSDP_HOME%\jaxp\lib

    JWSDP_LIBS=%JWSDP_HOME%\jwsdp-shared\lib

    PATH=%JAXB_HOME%\bin;%JWSDP_HOME%\jwsdp-shared\bin;%PATH%

    CLASSPATH= %JWSDP_HOME%\jaxb\lib\jaxb-api.jar;

    %JWSDP_HOME%\jaxb\lib\jaxb-impl.jar;

    %JWSDP_HOME%\jaxb\lib\jaxb-xjc.jar;

    %JWSDP_HOME%\jwsdp-shared\lib\activation.jar;

    %JWSDP_HOME%\sjsxp\lib\jsr173_api.jar;

    %JWSDP_HOME%\sjsxp\lib\sjsxp.jar;

    < xmlnamespace prefix ="w" ns ="urn:schemas-microsoft-com:office:word" />
    注:注意自己原来的CLASSPATH设置,不要覆盖了。

    3)        Eclipse 工程构建路径配置:
    JAXB学习 - mengshj - 可可的梦幻世界JAXB学习 - mengshj - 可可的梦幻世界

    注:如图所示的JAR都添加到工程的构建路径中。

    四、实例分析

    1.         确定XML Schema
        
    要确定XML Schema意味着你要确定一个规则,来约束你的XML文档,使所有符合这个规则的XML文档看上去都很类似。例如,在这个例子中,我们希望XML文档的格式如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <users>

        <user>

            <name>小李</name>

            <sex>男</sex>

            <age>24</age>

        </user>

        <user>

            <name>小丽</name>

            <sex>女</sex>

            <age>18</age>

        </user>

        <user>

            <name>小王</name>

            <sex>男</sex>

            <age>22</age>

        </user>

    </users>


        XML文档所包含的意思:一个用户组 <users> 里面有多个 <user>,而每个 <user> 又包括<name><sex><age>这些信息,而要在应用程序中想要操纵此XML文档,还要根据这个XML文档,产生一个Schema文档。

    <?xml version="1.0" encoding="UTF-8"?>

    <schema targetNamespace="us" xmlns="http://www.w3.org/2001/XMLSchema"

        xmlns:tns="us">

     

        <simpleType name="Sex">

            <restriction base="string">

                <enumeration value="男"></enumeration>

                <enumeration value="女"></enumeration>

            </restriction>

        </simpleType>

     

        <complexType name="User">

            <sequence>

                <element name="name" type="string"></element>

                <element name="age" type="int"></element>

                <element name="sex" type="tns:Sex"></element>

            </sequence>

        </complexType>

     

        <element name="user" type="tns:User"></element>

     

        <complexType name="Users">

            <sequence>

                <element ref="tns:user" minOccurs="1"

                    maxOccurs="unbounded">

                </element>

            </sequence>

        </complexType>

     

        <element name="users" type="tns:Users"></element>

    </schema>

     

        SchemaXML文档之间的关系,就好像Java中类与实例的关系。每个符合 schemaXML文档,都是这个Schema的一个实例;而Schema本身是一个模板,它规定了XML文档应该是什么样的。这个Schema描述了对xml文档的约束:

    1)        它规定了<users>这个节点内可以包含一个或多个<user>的节点。

    2)        每个<user>节点包括名字、年龄、性别这几个信息

    3)        规定了<sex>属性由“男”和“女”组成

    2.         使用编译工具生成相应的Java
        有了Schema文件以后,我们就可以利用JAXB工具包,让它来替我们生成操纵符合这个Schema规定的所有XML实例文档的所有Java源代码。
        如果已经设置好了环境变量的话(请参考“设置环境变量”),那么只需要运行JAXB包所带的“xjc”运行程序,例如
    %JAXB_HOME%\bin\xjc.bat userSchema.xsd -d src –p primer.userinfo
    其中:

    A.        %JAXB_HOME%是你安装JAXB工具包的位置,通常在jwsdp工具包的子目录下。

    B.        userSchema.xsd Schema的文件名,一般以xsd作为文件名的后缀。

    C.        -d  的选项,是指定系统生成的Java源代码所放置的目录,示例中为:src

    D.       -p  的选项,是指定系统生成的Java源代码所在的Java Package的名称,示例中为:primer.userinfo

    E.        还有更多的选项,请参考JAXB的相关文档。

    如果运行成功的话,就会在你"-d"选项指定的目录下产生一些java代码文件:

    3.         在应用程序中使用这些代码
        下面我们分析一下如何在我们的应用程序中使用JAXB工具包替我们生成的代码。

    1)        JAXBContext 提供了一个入口,通过这个入口可以管理必要的XML/Java绑定信息。客户端应用程序通过newInstance(contextPath)方法得到该类的新实例。contextPath 参数包含一个或多个Java包名,这些Java包就是了JAXB编译器所产生的接口代码所在的Java包。该参数值初始化JAXBContext 对象,使得它能够管理JAXB编译器产生的接口。

    JAXBContext jc = JAXBContext.newInstance("primer.userinfo");

     

    2)        而通过ObjectFactory,可以直接生成根节点java对象Users 和子对象User。

    User userA = objFactory.createUser();

    Users users = objFactory.createUsers();

    3)        对于MarshallerUnmarshaller,这两个对象主要是用于Java对象和XML文档互相转换的主要接口(Marshaller负责从Java对象到XML文档的转换,Unmarshaller负责从XML文档到Java对象的转换)。

    JAXBElement usersE = objFactory.createUsers(users);

    Marshaller marshaller = jc.createMarshaller();

    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

    marshaller.marshal( usersE,new FileOutputStream("src/test.xml"));

     Marshaller能把Users 对象转换成XML文件

    JAXBElement usersE = (JAXBElement)jc.createUnmarshaller().unmarshal(new File("src/test.xml"));

    Users users = (Users)usersE.getValue();

     Unmarshaller能把 XML文件转换成Users对象

    4.         实例代码

    public void javaToXml() {

            try {

                JAXBContext jc = JAXBContext.newInstance("primer.userinfo");    //参数为JAXB生成的java文件所在包名

                ObjectFactory objFactory = new ObjectFactory(); //生成对象工厂

               

                User userA = objFactory.createUser();

                userA.setName("西瓜");

                userA.setAge(26);

                userA.setSex(Sex.);

     

                User userB = objFactory.createUser();

                userB.setName("冬瓜");

                userB.setAge(19);

                userB.setSex(Sex.);

               

                User userC = objFactory.createUser();

                userC.setName("南瓜");

                userC.setAge(22);

                userC.setSex(Sex.);

     

                Users users = objFactory.createUsers();

                List<User> list = users.getUser();

                list.add(userA);

                list.add(userB);

                list.add(userC);

               

                JAXBElement usersE = objFactory.createUsers(users);

                Marshaller marshaller = jc.createMarshaller(); 

                marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

                marshaller.marshal( usersE,new FileOutputStream("src/test.xml"));

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    五、参考资料

    1.         JAXB
    http://java.sun.com/webservices/jaxb/

    2.         XML Schema
    http://www.w3.org/1999/05/06-xmlschema-1/
    http://www.w3.org/1999/05/06-xmlschema-2/

  • 相关阅读:
    两个路由器配置静态路由只能单边 ping 通
    CVE202125646:Apache Druid远程命令执行漏洞复现
    批量修改图片的格式
    十大远程控制软件排名
    Splashtop 免费60天 大赠送
    单例设计模式
    蓄水池抽样算法/水塘采样算法
    kafka安装(单机版)
    LeetCode382链表随机节点
    LeetCode398随机数索引
  • 原文地址:https://www.cnblogs.com/SoulSpirit/p/2949956.html
Copyright © 2011-2022 走看看