`

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,
并且代码比以前更易读了)

分享到:
评论

相关推荐

    CANdb++_ADMIN.J1939_3.0SP27安装包(带Cdbstat.dll).zip

    例如,用户可以定义帧结构,包括标识符、数据长度、发送周期等,并且支持多种CAN总线标准,如CAN2.0A、CAN2.0B和J1939。此外,它还支持扩展功能,如错误检测码和错误处理策略,使得开发者能够确保数据传输的准确性和...

    KB-1B V2.0开发板原理图

    KB-1B V2.0开发板通过集成多种功能模块,为用户提供了一个全面且易于使用的开发平台。无论是学习MSP430单片机的基础知识,还是进行复杂的项目开发,这款开发板都能提供强大的支持。通过对上述关键组件的分析,我们...

    M531X DM流程_v2.0.pdf

    该命令设置了更新间隔为10分钟,appKey为"M100000052",密码为"n525A97z0M7Vyh91b0508l7j0U5g2g9Y",版本号为V2.0,并选择商用平台。重启后,设备成功联网后会注册至商用平台,并每隔10分钟更新心跳数据。 ### 关闭...

    最小二乘法的多项式拟合(matlab实现) (3).docx

    B(j) = B(j) + y(i)*x(i)^(j-1); end end B = B'; % 计算未知数矩阵 a a = inv(A) * B; % 画出拟合曲线 x_fit = -1.0:0.0001:2.0; z = a(1) + a(2)*x_fit + a(3)*x_fit.^2 + a(4)*x_fit.^3; plot(x_fit, z) ...

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

    这个线性方程组可以表示为矩阵形式,即 (A'A)x = A'B,其中 A 是一个 (m+1) x (n+1) 的矩阵,它的第 i 行第 j 列元素为 xi^(j-1),B 是一个 (m+1) x 1 的向量,其第 i 个元素为 yi。 4. **MATLAB 实现**: 在...

    (完整版)最小二乘法的多项式拟合(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.^...

    2009-20010学年第2学期《C语言程序设计基础》考试题(A).doc

    6. 表达式计算:题目中涉及单精度数和浮点数的运算,要使y的值为7.0,只有B) y+=x+2.0满足条件,因为x=2.0,所以y变为3.0+2.0=5.0。 7. 类型转换与算术运算:当x=(double)(y*3+((int)y%4))时,y=3.5,y%4的结果是1...

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

    B(j) = B(j) + y(i) * x(i)^(j-1); end end; B = B'; ``` 3. **求解线性方程组**:使用矩阵的逆运算求解 a。 ```matlab a = inv(A) * B; ``` 4. **绘制拟合曲线**:用求得的系数 a 生成拟合曲线并显示在图上。 `...

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

    B(j) = B(j) + y(i) * x(i)^(j-1); end end B = B'; % 转置B以便矩阵乘法 % 计算系数 a = inv(A) * B; % 画图 x_fit = -1.0:0.0001:2.0; y_fit = a(1) + a(2) * x_fit + a(3) * x_fit.^2 + a(4) * x_fit.^3; ...

    最小二乘法的多项式拟合(matlab实现) (2).docx

    B(j) = B(j) + y(i-1) * x(i-1)^(j-1); end end end B = B'; % 转置B % 计算系数a a = inv(A'*A) * A' * B; % 预测值计算 x_new = [-1.0:0.0001:2.0]; z = a(1) + a(2)*x_new + a(3)*x_new.^2 + a(4)*x_new.^3;...

    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的角度分布,...

    struts2.0的标签库

    B. 数据展示与输入控件: - `&lt;s:bean&gt;`:类似于 Struts1.x 中的 JavaBean 属性访问。 - `&lt;s:checkbox&gt;` 和 `&lt;s:checkboxlist&gt;`:分别用于单个复选框和多个复选框的选择。 - `&lt;s:combobox&gt;`:创建一个下拉列表,支持 ...

    数值计算方法习题答案第四章的

    根据泰勒公式,我们知道对于任意\(x\in [a,b]\),存在某个\(\varepsilon\),使得\(f(x)\)可以表示为\(L(x)\)加上一个余项\(R_n(x)\),其中\(L(x)\)是\(f(x)\)在\([a,b]\)上的插值多项式,而\(R_n(x)\)是该多项式的...

    运算符与表达式练习题附答案知识.pdf

    6. 浮点数运算与类型转换:`c=a/b+0.4`,当`a=8`,`b=5`时,`a/b`的结果为1.6,加上0.4后,结果为2.0,但C语言中浮点数默认保留小数点后几位可能会有误差,所以最接近的整数值是2,答案是B。 7. 表达式求值:`(x+y)...

    C语言各章节习题.pdf

    - a=1,b=3,c=5,d=4时,根据条件分支,x的值为1,因为满足a&lt;b,进入第一个if语句。 - 输入6时,x++&gt;5为真,打印x+1,即7。输入4时,x++&gt;5为假,打印x--,即3。 - 输入5时,m++&gt;5为真,打印m+1,即6。输入其他值...

    最小二乘法的多项式拟合(matlab实现).docx

    设计矩阵 `A` 的第 `i` 行、第 `j` 列元素为 `x_i^(j-1)`,而目标向量 `B` 的第 `i` 个元素为 `y_i`。这样,最小二乘解可以通过以下公式得到: `a = inv(A'*A)*A'*B` 在MATLAB中,我们可以按照以下步骤进行操作: ...

    学习笔记-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这个...

Global site tag (gtag.js) - Google Analytics