XML 和 Java Object 的数据转换

     现在不少项目的接口在定义时基本上使用XML来编写,方便不同的项目间建立数据交互或调用,特别在异构系统间更是如此,如现在常用的Webservice技术也是基于这个原理。XML的广泛使用就涉及到在定义接口后的Object和XML之间相互转换的问题,研究了一下JAXB(Java Architecture for XML Binding),发现是个很好和很方便的Java API,在Java Web Services Developer Pack中提供,Web Service接口的定义就是基于XML的,所以也要使用到XML-Object的转换。
   
     这里对XML仅涉及到XML模式(Schema)。简单的说Schema就是XML的模版,是用来定义接口XML是如何编写的模版,说明元素的从属关系和约束条件等,一般在建立单纯的XML接口时,可以加以编写XML Schema来表明接口的定义,接下来的开发就是基于先定义或Schema已定义好的情况下开始的。

     首先来看环境的搭建,使用JAXB需要的类包,可以从安装后的<a href="http://java.sun.com/webservices/downloads/webservicespack.html">
     Java Web Service Developer Pack1.5</a>中得到:
        <JWSDP>/jaxb/lib/jaxb-api.jar
        <JWSDP>/jaxb/lib/jaxb-impl.jar
        <JWSDP>/jaxb/lib/jaxb-libs.jar
        <JWSDP>/jaxb/lib/jaxb-xjc.jar
        <JWSDP>/jwsdp-shared/lib/namespace.jar
        <JWSDP>/jwsdp-shared/lib/jax-qname.jar
        <JWSDP>/jwsdp-shared/lib/relaxngDatatype.jar
        <JWSDP>/jwsdp-shared/lib/xsdlib.jar
     由于之前我安装了SUN Java Studio Enterprise7,所以对应的从<jstudio>/Ent_04Q4/jwsdp-1.3/jaxb/lib 和 <jstudio>/Ent_04Q4/jwsdp-1.3/jwsdp-shared 中也可以对应得到。
     
     环境资源搭建好后,并在Schema存在的情况下,我们就可以通过JAXB提供的XJC工具来自动生成其对应的Java类。在一个Schema中,一个element由<xs:element/>代替,comlexType由<xs:complexType/>代替。下面是用来举例的例子,sample.xsd:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <xsd:element name="catalog" type="catalogType"/>
     <xsd:complexType name="catalogType">
      <xsd:sequence>
       <xsd:element ref="journal"  minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="section" type="xsd:string"/>
      <xsd:attribute name="publisher" type="xsd:string"/>
     </xsd:complexType>
     <xsd:element name="journal" type="journalType"/>
     <xsd:complexType name="journalType">
      <xsd:sequence>
       <xsd:element ref="article"  minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
     </xsd:complexType>
     <xsd:element name="article" type="articleType"/>
     <xsd:complexType name="articleType">
      <xsd:sequence>
       <xsd:element name="title" type="xsd:string"/>
       <xsd:element name="author" type="xsd:string"/>
      </xsd:sequence>
      <xsd:attribute name="level" type="xsd:string"/>
      <xsd:attribute name="date" type="xsd:string"/>
     </xsd:complexType>
    </xsd:schema>

     为创建该Schema对应的类文件,我们先建立test目录,把sample.xsd Copy进来,再建立src目录,然后使用命令设置环境:

     set path=<jstudio>/Ent_04Q4/jwsdp-1.3/jwsdp-shared/bin;<jstudio>/Ent_04Q4/jwsdp-1.3/jaxb/bin ,指定xjc的环境和路径,如果使用JWSDP,对应的则是<JWSDP>/jaxb/bin 和 <JWSDP>/jwsdp-shared/bin。
     然后用命令:xjc -p com.javayou.jaxb example.xsd -d src 生成Schema对应的类,命令的意思是指用example.xsd 生成对应的Java代码,指定的包名为com.javayou.jaxb,生成的文件位于src内。这样我们会看到一系列的代码生成打印:
     parsing a schema...
     compiling a schema...
     com/javayou/jaxb/impl/ArticleImpl.java
     com/javayou/jaxb/impl/ArticleTypeImpl.java
     ... ...

     代码生成结束后可以在src内发现用sample.xsd生成的Java代码,完全自动化操作,非常方便。    
     接下来在Eclipse里建立新项目,把需要的jar包导入项目,再把刚才生成的系列代码全部导入项目。
     建立我们的演示例子,代码如下:
    

    package com.javayou.jaxb;
 
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
   
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
   
    import com.javayou.jaxb.impl.ArticleImpl;
    import com.javayou.jaxb.impl.CatalogImpl;
    import com.javayou.jaxb.impl.JournalImpl;
   
    /*
     *  @author Liang.xf 2004-12-22
     *  JAXB 演示
     *  www.javayou.com
     */
    
    public class Main {       
        public static void main( String[] args ) {
            try {
                System.out.println("--- Example begin ---");
                               
                //要创建Java 的数据类,则先创建ObjectFactory
                ObjectFactory factory = new ObjectFactory();
                //创建Catalog
                CatalogImpl catalog=(CatalogImpl)(factory.createCatalog());
                catalog.setSection("Java Technology");
                catalog.setPublisher("IBM developerWorks");
               
                //创建子项数据
                JournalImpl journal = (JournalImpl)(factory.createJournal());
                List journalList = catalog.getJournal();
                journalList.add(journal);
                ArticleImpl article=(ArticleImpl)(factory.createArticle());
                article.setLevel("Intermediate");
                article.setDate("January-2004");
                article.setTitle("Service Oriented Architecture Frameworks");
                article.setAuthor("Naveen Balani");
                List articleList=journal.getArticle();
                articleList.add(article);
                System.out.println("/n等待数据输出到 example1.xml ... ");
               
                //创建JAXBContext,用于产生Marshaller和Unmarshaller
                JAXBContext jc = JAXBContext.newInstance("com.javayou.jaxb");
               
                //Marshaller-把Java Object转到XML,相反则叫Unmarshaller
                Marshaller marshaller = jc.createMarshaller();
                marshaller.marshal(catalog, new FileOutputStream 
                                                                ("example1.xml"));
               
                System.out.println("/n输出数据到 example1.xml 完毕./n");
                System.out.println("等待读取和打印 example1.xml ... ");
               
                //读取sample1.xml和打印
                Unmarshaller u = jc.createUnmarshaller();
                //写出到 example1.xml文件中
                Catalog uca =
                    (Catalog)u.unmarshal(new FileInputStream("example1.xml"));
               
                //演示从sample1.xml读取数据并打印
                marshaller.setProperty(
                      Marshaller.JAXB_FORMATTED_OUTPUT,  Boolean.TRUE );
                marshaller.marshal(uca, System.out);                
                System.out.println("Example 演示完毕.");
            } catch( JAXBException je ) {
                je.printStackTrace();
            } catch( IOException ioe ) {
                ioe.printStackTrace();
            }
        }
    }

     编译后,在Eclipse内点击运行,可以看到 Console 打印生成XML,以及重新读取XML数据和打印,至此XML和Object之间的数据转换就轻松完成了,够简单吧,那就试试吧。

附jxc命令的参数:
-nv Strict validation of the input schema(s) is not performed.
-b <file> Specifies the external binding file.
-d <dir>  Specifies the directory for generated files.
-p <pkg>  Specifies the target package.
-classpath <arg>  Specifies classpath.
-use-runtime <pkg>  The impl.runtime package does not get generated. 
-xmlschema  The input schema is a W3C XML Schema (default).
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值