`

J A X B 2.0使用

阅读更多


以前实习的时候用过JAXB1.x,据说JAXB2.0使用了Java 5.0的新特性,例如注解、泛型,使得JAXB更容易使用,于是从
网上下来试了一下:

https://jaxb.dev.java.net/servlets/ProjectDocumentList?folderID=6344&expandFolder=6344&folderID=0
下载到JAXB2_20061115.jar,为了方便使用把JAXB2_20061115.jar拷到工程中,本事例使用Eclipse开发,工程目录
为:D:\eclipse\workspace\JaxbTest,可以新建一个目录jaxb来存放JAXB2_20061115.jar,在命令行下,把目录切换
到jaxb下(当然开始要配置好环境变量),使用java -jar JAXB2_20061115.jar生成一个目录:jaxb-ri-20061115,里面
有bin和lib,在bin目录下新建一个generator.bat的批处理:
xjc -d D:\eclipse\workspace\JaxbTest\src -p "edu.jlu.xml" "D:\eclipse\workspace\JaxbTest\schema\messages.xsd"
其中D:\eclipse\workspace\JaxbTest\src为原文件的目录,edu.jlu.xml为生成Java类的包名,D:\eclipse\workspace\JaxbTest\schema\messages.xsd为xml schema文件的路径。
这样以后我们每次修改messages.xsd,我们只需要双击generator.bat来更新Java类就可以了。
下面我们我们在messages.xsd定义schema:

<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> 

然后双击generator.bat就可以生成Java类了,本例我们生成了ArticleType.java,CatalogType.java,
JournalType.java和ObjectFactory.java
一般我们会对XML根的那个element对应的Java类,写一个实用的xml与object之间转换的类,本例中
为那个element为catalog,对应的Java类为CatalogType.java,我们可以写一个CatalogTypeUtils来帮助
我们实现xml与object之间的转换:

 

package edu.jlu.xml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class CatalogTypeUtils ...{
    
private static JAXBContext jaxbContext = null;
    
private static Marshaller marshaller = null;
    
private static ObjectFactory factory = null;
/**//*
 *@param catalogType is the object that is used to build xml
 *@param xmlDocument is the file where xml to output
*/

    
public static void buildXml(CatalogType catalogType, File xmlDocument) ...{

        
try ...{
            jaxbContext 
= JAXBContext.newInstance("edu.jlu.xml");
            marshaller 
= jaxbContext.createMarshaller();
            ObjectFactory factory 
= new ObjectFactory();
            JAXBElement
<CatalogType> catalogElement = factory.createCatalog(catalogType);
            marshaller.marshal(catalogElement,
new FileOutputStream(xmlDocument));
        }
 catch (FileNotFoundException e) ...{
            e.printStackTrace();
        }
 catch (JAXBException e) ...{
            e.printStackTrace();
        }

    }

 
/**//*
  *@param xmlDocument the xml file to build object 
  *@return the built object
  
*/

    
public static CatalogType buildObject(File xmlDocument) ...{
        JAXBElement
<CatalogType> catalogElement = null;
        
try ...{
            JAXBContext jaxbContext 
= JAXBContext.newInstance("edu.jlu.xml");
            Unmarshaller unMarshaller 
= jaxbContext.createUnmarshaller();
            catalogElement 
= (JAXBElement<CatalogType>) unMarshaller.unmarshal(xmlDocument);
        }
 catch (Exception e) ...{
            e.printStackTrace();
        }

        
return catalogElement.getValue();
    }

}

下面我们做一下测试:

 

package edu.jlu.test;

import java.io.File;
import edu.jlu.xml.ArticleType;
import edu.jlu.xml.CatalogType;
import edu.jlu.xml.CatalogTypeUtils;
import edu.jlu.xml.JournalType;
import edu.jlu.xml.ObjectFactory;

public class Test ...{
    
private ObjectFactory factory = new ObjectFactory();
    
/**//*
     * @param xmlDocument is the output xml file 
     
*/

    
public void testObject2Xml(File xmlDocument) ...{        
            CatalogType catalog 
= factory.createCatalogType();
            assmbleCatalogForTest(catalog);
            CatalogTypeUtils.buildXml(catalog,xmlDocument);
    }

    
/**//*
     * @param xmlDocument is the source xml file for generating Object
     
*/

    
public CatalogType testXml2Object(File xmlDocument)...{
        
return CatalogTypeUtils.buildObject(xmlDocument);
    }

    
/**//*
     * This function is used to assmble CatalogType object for test
     
*/

    
private CatalogType assmbleCatalogForTest(CatalogType catalog)...{
        catalog.setSection(
"Java Technology");
        catalog.setPublisher(
"IBM developerWorks");

        JournalType journal 
= factory.createJournalType();
        ArticleType article 
= factory.createArticleType();

        article.setLevel(
"Intermediate");
        article.setDate(
"January-2004");
        article.setTitle(
"Service Oriented Architecture Frameworks");
        article.setAuthor(
"Naveen Balani");

        java.util.List journalList 
= catalog.getJournal();
        journalList.add(journal);
        java.util.List articleList 
= journal.getArticle();
        articleList.add(article);

        article 
= factory.createArticleType();
        article.setLevel(
"Advanced");
        article.setDate(
"October-2003");
        article.setTitle(
"Advance DAO Programming");
        article.setAuthor(
"Sean Sullivan");
        articleList 
= journal.getArticle();
        articleList.add(article);

        article 
= factory.createArticleType();
        article.setLevel(
"Advanced");
        article.setDate(
"May-2002");
        article.setTitle(
"Best Practices in EJB Exception Handling");
        article.setAuthor(
"Srikanth Shenoy");

        articleList 
= journal.getArticle();
        articleList.add(article);
        
return catalog;
    }

    
    
public static void main(String[] argv) ...{
        Test test 
= new Test();
        test.testObject2Xml(
new File("E:\hello.xml"));
        CatalogType type 
= test.testXml2Object(new File("E:\hello.xml"));
        System.out.println(type.getPublisher());
    }

}

我们发现JAXB2.0比以前简单多了,并且生成的代码少了许多。(以前会生成type接口和Type的
实现类,其实生成的Object分离出接口的意义并不大,JAXB2.0直接生成一个type具体的class,
并且代码比以前更易读了)

分享到:
评论

相关推荐

    C++复习资料之系列

    (a) 1&lt;X(b) X==2||X==3||X==4 (c) 1&lt;X&&X(d) !(X)&&!(X&gt;=5) 26. 已知x=5,则执行语句 x += x -= x*x ; 后,x的值为( c )。 (a)25 (b)40 (c)-40 (d)20 27. 设a=1,b=2,c=3,d=4,则条件表达式...

    (完整版)最小二乘法的多项式拟合(matlab实现).doc

    B(j) = B(j) + y(i)*x(i)^(j-1); end end B = B'; a = inv(A)*B; x = [-1.0:0.0001:2.0]; z = a(1) + a(2)*x + a(3)*x.^2 + a(4)*x.^3; plot(x, z) legend('离散点', 'y=a(1)+a(2)*x+a(3)*x.^2+a(4)*x.^...

    sequence.pdf

    n B A ∀1 ≤ i &lt; j ≤ m a and a = b i b j 0 and B = {a ,a ,⋯ ,a } b 1 b 2 b m φ(1 + a ) ∑ i=1 m b i φ(x) x x A 10 + 9 7 n n a ,a ,⋯ ,a 1 2 n 10 + 9 7 样例1输出 12 样例1解释 符合条件的子序列有: ...

    衰减J /ψ→ϕηη′的观测研究

    或者,假设JP = 1 +,则显着性为3.8σ,质量和宽度分别为(2062.8±13.1±7.2)MeV / c2和(177±36±35)MeV,产物分支分数B(J /ψ→ηX)×B(X→ϕη′)=(9.6±1.4±2.0)×10-5。 研究了J /ψ→ηX的角度分布,...

    学习笔记-ODE差分解法1

    x(j+1) = x(j-1) + 2.0 * dt * ((b * x(j) + c * (j) * dt) / a); t(j+1) = tinit + (j-1) * dt; end % 绘图 plot(t, x) title('中点法') xlabel('t'), ylabel('x(t)') ``` 四、二阶Runge-Kutta法 二阶Runge-...

    linux下GTK+2.0开发的单词数值计算器

    1、 按照规则计算单词的值,如果 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 26个字母(全部用大写)的值分别为1 2 3 4 5 6 7 8 9 10 11 12 13 1 15 16 17 18 19 20 21 22 23 24 25 26, 如 WINJACK这个...

    标准库元器件命名及编号规范V2.0(03.5.18)[借鉴].pdf

    X/A/N/H/V/P ### 3.2.19 变压器 TR/TYPE/N ### 3.2.20 按键 SW/N/(TYPE)R1 ### 3.2.21 蜂鸣器/喇叭 SP/TYPE ### 3.2.22 商标/标志 LOGO/TYPE ### 3.2.23 编码钮 ENC/TYPE ### 3.2.24 排线组件 JW/A/N #...

    在s = 7 $$ \ sqrt {s} = 7 $$和13 TeV的pp碰撞中测量B±生产横截面

    在质子中心能量为7和13 TeV的pp碰撞中研究了B±介子的产生,分别使用B±→J /ψK±衰变和分别对应于1.0 fb -1和0.3 fb -1的数据样本 。 两种装料相加并在横向动量范围0 &lt;p T &lt;40 GeV / c和速度范围2.0 &lt;y &...

    Pse-in-One 2.0:Web服务器的改进程序包,用于生成各种模式的DNA,RNA和蛋白质序列的伪组分

    Pse-in-One 2.0是从Pse-in-one(Liu,B.,Liu,F.,Wang,X.,Chen,J.Fang,L.&Chou,KC Nucleic Acids)演变而来的Web服务器程序包研究,2015,43:W65-W71)。 为了使它更加灵活和全面,正如许多用户所建议的...

    BestFitting

    c[i][j]+=a[i][k]*b[k][j]; } } } return c; } public double[][] trans(double tem[][]){ double t1[][]=new double[tem[0].length][tem.length]; for(int i=0;i;i++){ for...

    USBCAN-XE-X 产品数据手册.pdf

    USBCAN-XE -X系列工业级CAN通讯卡可选支持CANopen 、DeviceNet 、SAE J1939、iCAN或 CAN2.0A/B 等 CAN-bus 应用层协议,支持 5Kbps ~ 1M bps 之间的任意波特率,并提供多个操作系统的设备驱波特率,工具 软件 等,能...

    千锋Unity3D、C#入门课程 [MP4] (16.99G)

    21.23Renderpath0 a- k7 h3 e: F+ X: {5 a* F 22.24surface5.00 P9 O+ f* ]4 r$ x0 s1 K/ o3 K$ w 23.25顶点变化! ]; M# l$ B: _: a 24.26片段着色器 25.27参数传递 26.28向量的运算) a$ r1 U/ e9 y7 |2 k% ]/ @ 27....

    [游戏开发] 千锋Unity游戏开发高级教程之图形学 [MP4]

    E% B# ` j3 g+ n X 21.23Renderpath1 v4 Q/ S M" [) O; D1 X 22.24surface5.0 23.25顶点变化6 r( p2 D9 F* Y( O7 |" B 24.26片段着色器% p; M5 s- _& V2 ~! v# b 25.27参数传递 26.28向量的运算 27.29灯光原理 28....

    C语言训练题1.pdf

    若有定义语句:double x[5]={1.0,2.0,3.0,4.0,5.0}, *p=x;则错误引用x数组元素的是x[5]。若有定义语句:char s[10]="1234567\0\0"; ,则strlen(s)的值是7。 6. 选择题(36)~(40) 在C语言中,以下叙述中错误的...

    WAP2.0企业系统(QuickWAP XML)

    国内不少企业采用的这套代码: $ P`,%M X 比如:美吾发快速护发染发霜-品牌直销WAP 站点:http://WAP.MWF.HK fg/fP tTP 吐鲁番党建网:http://wap.turpandj.gov.cn ;8!I?Nb\;( 迷你驿站:...

    通过衰变ηc(1S)→pp对质子-质子碰撞中ηc(1S)产生截面的测量

    ˆ = 1.74±0.29±0.28±0.18B,在质心能量s = 7TeV,使用对应于0.7 fb -1和σc(1S)/σ的综合亮度的数据 J / ψ = 1.60±0.29±0.25±0.17B在s = 8TeV使用2.0 fb -1。 引用的不确定性是按顺序的,统计的,...

    ASP.NET_2.0_制作彩色验证码教程

    char[] character ={ ''2'', ''3'', ''4'', ''5'', ''6'', ''8'', ''9'', ''A'', ''B'', ''C'', ''D'', ''E'', ''F'', ''G'', ''H'', ''J'', ''K'', ''L'', ''M'', ''N'', ''P'', ''R'', ''S'', ''T'', ''W'', ''X...

    〖程序设计基础〗练习题3及答案

    if( ++a==b ) x=++a*x; A) 35 B) 25 C) 20 D) 5 11.下列语句序列执行后,k 的值是( )。 int i=6,j=8,k=10,m=7; if(i&gt;j||m) k++; else k--; A) 12 B)11 C) 10 D) 9 12.下列语句序列执行后,k的值是( )。 int j=8,...

    神经网络算法

    和输出单元的激活函数为一S 型函数: tanh( ) j j y = a bnet ,且a =1.716,b = 2 / 3。 (a) 设 描 述 输入层到隐含层权值( , 1,2, 0,1,2) ji w j = i = 及隐含层到输出层权值 ( , 1, 0,1,2) kj w k = j = 的矩阵...

Global site tag (gtag.js) - Google Analytics