jaxb 2.0
 
1.下载
jwsdp-1.5中包含的jaxb是1.0版本,最新的版本需要在https://jaxb.dev.java.net/下载:
当前版本的下载地址为:
https://jaxb.dev.java.net/files/documents/51/15728/jaxb_ri_20050606.jar
https://jaxb.dev.java.net/jaxb20-ea/jaxb_ri_20050407.jar
源代码为:
https://jaxb.dev.java.net/files/documents/51/15174/jaxb_ri_src_20050407.jar
2.安装
jaxb_ri_20050606.jar所在的目录下,进入命令行,
命令行下运行:java -jar jaxb_ri_20050606.jar’
然后会弹出授权协议窗口,必须把协议拉到底部,才可以点accept。
点accept之后上列出所有解压出来的文件名字。
此时,在当前目录下会有一个叫jaxb-ri-20050606的目录,里面有jaxb的jar文件和api文档。
3.根据schema文件xsd生成java文件的命令如下:

e:\javalibs\xmllibs\jaxb-ri-20050606\bin>xjc -d "e:\jb\jaxbdemo\src"  -p "com.lizongbo.jaxbdemo"  "e:\jb\jaxbdemo\jaxbtest.xsd"
由于jaxb2.0中生成的java文件使用的是jdk1.5的语法特性:
 
generics for type safe collections
enum type for binding of simple type with enumeration facets
better support for xml schema types using datatypes in jaxp 1.3
leveraging jaxp 1.3 validation for smaller footprint
more compact binding based on constraining facets defined in schema
(from http://weblogs.java.net/blog/sekhar/archive/2005/03/jaxb_20_early_d.html )
由于使用了j2se5.0的特性,jaxb2.0生成的java代码比jaxb1.0生成的要简洁得多了。
jbuilder在编译这些java文件的时候需要设置工程的jdk为1.5,并且编译语法也必须是1.5。
不过jbuilder好像有bug,有些无法生成class文件,于是只好在命令行下手工编译:
e:\javalibs\xmllibs\jaxb-ri-20050606\bin>javac -classpath "e:\jb\jaxbdemo\classes;e:\javalibs\javamail-1.3.2\mail.jar;e:
\javalibs\jaf-1.0.2\activation.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib\jaxb1-impl.jar;e:\javalibs\xmllibs\jaxb-ri-2
0050606\lib\jaxb-api.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib\jaxb-impl.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib
\jaxb-xjc.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib\jaxb-xjc.jar;e:\javalibs\xmllibs\jaxb-ri-20050606\lib\jsr173_1.0_
api.jar;d:\jdk1.5.0_02\jre\lib\ext\sunjce_provider.jar;d:\jdk1.5.0_02\jre\lib\ext\sunpkcs11.jar;d:\jdk1.5.0_02\jre\lib\e
xt\dnsns.jar;d:\jdk1.5.0_02\jre\lib\ext\localedata.jar;d:\jdk1.5.0_02\jre\lib\im\indicim.jar;d:\jdk1.5.0_02\jre\lib\im\t
haiim.jar;d:\jdk1.5.0_02\jre\lib\jce.jar;d:\jdk1.5.0_02\jre\lib\charsets.jar;d:\jdk1.5.0_02\jre\lib\deploy.jar;d:\jdk1.5
.0_02\jre\lib\javaws.jar;d:\jdk1.5.0_02\jre\lib\jsse.jar;d:\jdk1.5.0_02\jre\lib\plugin.jar;d:\jdk1.5.0_02\jre\lib\rt.jar
;d:\jdk1.5.0_02\lib\dt.jar;d:\jdk1.5.0_02\lib\htmlconverter.jar;d:\jdk1.5.0_02\lib\jconsole.jar;d:\jdk1.5.0_02\lib\tools
.jar;d:\jdk1.5.0_02\sample\jnlp\servlet\jardiff.jar;d:\jdk1.5.0_02\sample\jnlp\servlet\jnlp-servlet.jar;d:\jdk1.5.0_02\s
ample\jnlp\servlet\jnlp.jar;d:\jdk1.5.0_02\demo\jfc\codepointim\codepointim.jar;d:\jdk1.5.0_02\demo\jfc\java2d\java2demo
.jar;d:\jdk1.5.0_02\demo\plugin\jfc\codepointim\codepointim.jar;d:\jdk1.5.0_02\demo\plugin\jfc\java2d\java2demo.jar"  -d
 e:\jb\jaxbdemo\classes "e:\jb\jaxbdemo\src\com\lizongbo\jaxbdemo\onlineusers.java"
 
 
4.一个简单的测试代码:
 
package com.lizongbo.jaxbdemo;
 
import javax.xml.bind.jaxbcontext;
import javax.xml.bind.jaxbexception;
import javax.xml.bind.marshaller;
import java.util.list;
 
public class testjaxb {
  public testjaxb() {
    super();
  }
 
  public static void main(string[] args) {
    objectfactory objf = new objectfactory();
    onlineusers ous = objf.createonlineusers();
    onlineusers.onlineuser ou = objf.createonlineusersonlineuser();
    ou.setsessionid("lizongbo");
    ou.setusername("http://www.donews.net/lizongbo/");
    ous.getonlineuser().add(ou);
    //system.out.println(ous.getonlineuser().size());
    try {
      jaxbcontext jc = jaxbcontext.newinstance("com.lizongbo.jaxbdemo");
      marshaller m = jc.createmarshaller();
      m.setproperty(marshaller.jaxb_encoding, "utf-8");
      m.setproperty(marshaller.jaxb_formatted_output, boolean.true);
      //m.setproperty(marshaller.jaxb_schema_location, "c:/testnoschema.xsd");
      //m.setproperty(marshaller.jaxb_no_namespace_schema_location, "c:/test.xsd");
      //m.setproperty(marshaller.jaxb_fragment, boolean.true); 以xml片断形式输出
      m.marshal(ous, system.out);
    }
    catch (jaxbexception je) {
    }
  }
}

 
5.如果需要在输出的xml中包含<?xml-stylesheet type=’text/xsl’ href=’foobar.xsl’ ?>
采取的做法是:
system.out.println("<?xml version=’1.0′?>");//<?xml version="1.0" encoding="utf-8" standalone="yes"?>
        system.out.println("<?xml-stylesheet type=’text/xsl’ href=’foobar.xsl’ ?>");       
        marshaller m = context.createmarshaller();
        m.setproperty(marshaller.jaxb_fragment, boolean.true);//设置为片断输出的方式
        m.marshal(poe,system.out);

 6.由于jaxb2.0生成的java代码不再在代码中内置实现schem校验,因此需要单独的指定schema来进行校验。
 
jaxbcontext jc = jaxbcontext.newinstance("com.lizongbo.jaxbdemo");
      system.setproperty("jaxp.debug", "1");
      marshaller m = jc.createmarshaller();
      javax.xml.validation.schemafactory sf = javax.xml.validation.
          schemafactory.newinstance("http://www.w3.org/2001/xmlschema");
      schema schema = sf.newschema(new file("e:/jb/jaxbdemo/jaxbtest.xsd"));
      m.setschema(schema);
因此在限制元素出现的个数(例如minoccurs="0" maxoccurs="2")方面,没有jaxb1.0方便,
也没有castor那样方便(castor也是在生成的代码内置支持)。
 
尤其是想借助schema来生成让某些元素个数不同的java文件时,还是cator比较好。
 
 
参考资料:
https://jaxb.dev.java.net/jaxb20-ea/
使用 xmlbeans 进行编程
xmlbeans 如何引发数据绑定的巨大变革
 http://www-128.ibm.com/developerworks/cn/xml/x-beans1/index.html
java 中的 xml: 文档模型,第一部分:性能
研究 java 中 xml 文档模型的特性和性能

http://www-128.ibm.com/developerworks/cn/xml/x-injava/index.html
 数据绑定专题

http://www-128.ibm.com/developerworks/cn/xml/theme/x-pracdb.html
java 中的 xml: 数据绑定,第 1 部分:代码生成方法 — jaxb 及其它
根据 dtd 或模式生成数据类
http://www-128.ibm.com/developerworks/cn/xml/x-databdopt/part1/index.html
java 中的 xml: 数据绑定,第 2 部分:性能
经过了第 1 部分对数据绑定框架的介绍后,现在对其进行测试
http://www-128.ibm.com/developerworks/cn/xml/x-databdopt/part2/index.html
xml 与 java 技术: 用 castor 进行数据绑定
使用开放源代码项目 cator 进行 java 的 xml 数据绑定
http://www-128.ibm.com/developerworks/cn/xml/x-bindcastor/index.html
 
实用数据绑定: 涉入现实世界
数据绑定实用入门
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb1.html
实用数据绑定: 考察 jaxb,第 1 部分
往返和 xml 到 java 的转换
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb2.html
实用数据绑定: 深入考察 jaxb,第 2 部分
进一步考察 jaxb 的往返能力
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb3.html
 
实用数据绑定: 使用 jaxme 转换 xml
编组和解组
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb5.html
 
实用数据绑定: 谁在使用这个东西,结果如何?
在应用程序中有效地插入数据绑定框架
http://www-128.ibm.com/developerworks/cn/xml/x-pracdb6.html
 
 


评论

该日志第一篇评论

发表评论

评论也有版权!