使用JAXB处理XML文档

JAXB介绍: http://www.itisedu.com/phrase/200604181429065.html

引用地址: http://www.netbei.com/Article/jsp/jsp3/200407/39.html

关键词:Java,XML,JAXB,DTD,绑定模式(Binding Schema),验证
(validate),marshal,unmarshal


JAXB以其方便的XML数据处理能力可能会引起你的兴趣。你可能还不了解JAXB是
什么,想要知道它到底有什么好处,如果这是你需要的,你才会再花时间去细细的
研究它,或者你只需要使用最基本的功能。然而Sun关于JAXB的文档有80页之
多。我想大部分人都没有耐心看完这样的长篇大论。本文以简短的篇幅介绍了
JAXB的基本使用,算是先睹为快吧。本文附带的代码包括了JAXB1.0 early 
access版本和本文所使用的代码。欢迎与我讨论: 
boyofjava@sina.com


本文假设你会使用Java编程,了解并能够看懂XML,DTD。



1 为什么要使用JAXB
在Java中处理XML数据的常规方法有SAX,DOM等。其中SAX使用起来很麻烦,
不能修改XML数据;而DOM的处理大文档速度非常的慢,易用性也不必SAX好到
哪里去。实际上,无论是SAX还是DOM都不是专门为Java准备的,它们都是访问
XML文档的统一底层接口,与语言无关。

现在我们有了另外的选择。这就是JAXB和JDOM。JDOM与本文无关,目前最新
的版本是beta8,感兴趣的话,可以访问http://www.jdom.org/。
JAXB的全名是Java ™ Architecture for XML Binding,目前是1.0的early
 access版本,在Sun的Java站点只有注册为成员才能够下载。JAXB的特点就是
将你用DTD定义好的XML文档映射为Java对象,提供简单、快速的数据操作方
式。要访问XML中的元素、属性只要通过相应对象上的一系列getter和 setter方
法。你还可以通过marshal方法将对象的数据写进XML文件,通过unmarshal方
法将XML文件的数据读入对象,通过validate方法验证XML文件是否符合DTD的
约束。JAXB的缺点就在于只能访问特定的(也就是你用DTD定义的)XML文档。



2 JAXB如何工作

JAXB包括了一个运行类库和一个模式编译器。首先你要定义XML的DTD,然后编\r
写一个绑定模式(Binding Schema)。DTD定义了XML文档,绑定模式也是一
个XML文件,指出DTD定义的XML文档如何被映射为Java对象。运行编译器,将
DTD和绑定模式作为参数传给编译器,编译器就会生成Java代码。编译生成的
Java代码,通过这些代码就可以访问XML文档了。

3 JAXB的安装

以1.0 early access为例,它不包含在JDK中,先到http://java.sun.com/xml
下载。注意由于是早期版本,需要先登录才能下载,本文附带的源码包含了
JAXB1.0 early access。下载后将文件解压缩,在lib目录中有两个文件。jaxb-
rt-1.0-ea.jar是运行支持库,jaxb-xjc-1.0-ea.jar是模式编译器。注意bin目录
中的xjc文件只能在UNIX下使用,如果你的系统是Windows,那么你需要在命令\r
行窗口手工输入命令来编译。为了在任何地方都可以运行模式编译器和它生成的代\r
码,我们要把这两的文件加入CLASSPATH。一个简单的办法是把这两个文件拷贝
到jre/lib/ext下。


4 一个简单的例子


有这样一个XML文档。它描述书的列表,举例如下:

quote:

文件exampleA.xml


<booklist></booklist>
    <book></book>
        <name></name>Java编程入门
        <author></author>张三
         <publishdate></publishdate> 2002-6-6
         <price></price> 35.0
    
    <book></book>
        <name></name>XML在Java中的应用
        <author></author>李四 
         <publishdate></publishdate> 2002-9-16
         <price></price> 92.0
    




其DTD文件如下:
quote:

文件bookList.dtd










现在我们就来编写一个最简单的绑定模式,其文件扩展名应该为xjs。
文件bookList.xjs
quote:


    




现在就可以运行模式编译器生成Java代码,请先保证CLASSPATH中包含了JAXB
的两个JAR文件。Windows用户注意bin目录下的那个文件是没用的。在命令行
运行:
java com.sun.tools.xjc.Main bookList.dtd bookList.xjs

如果没出问题,编译器就生成了Book.java,BookList.java两个文件。你不用
去理解这两个源文件里面的代码,只要知道怎么使用它们提供的方法就可以了。它\r
们的继承结构都是这样的:


java.lang.Object
   javax.xml.bind.ValidatableObject
      javax.xml.bind.MarshallableObject
         javax.xml.bind.MarshallableRootElement
                BookList or Book


BookList.java主要包含了以下方法
quote:

BookList()    //构造函数
List getBook()    //得到书的集合,List中的对象实际类型是Book,可以添加、
//修改、删除其中的元素
void deleteBook()   //删除集合
void emptyBook()    //删除并生成一个新的空集合
void marshal(X)      //将数据写进XML文档
void unmarshal(X)   //将数据从XML文档读入对象\r
void validate(X)    //检查是否符合DTD约束,同时检查子树。在这个例子中就
                   // 是BookList的Book集合
void validateThis()   //检查是否符合DTD约束,不检查子树\r
//其中marshal,unmarshal,validate被重载,有多种参数形式(可以参考
//JAXB的API文档)。


Book.java主要包含了以下方法
Book()
String getName()
String getAuthor()
String getPublishDate()
String getPrice()
void setName(String x)
void setAuthor(String x)
void setPublishDate(String x)
void setPrice(String x)
void marshal()
void unmarshal()
void validate()



现在我们就可以使用这两个文件访问XML了。首先编译这两个文件。编写一个\r
Test.java文件,把它和生成的两个文件以及前面的exampleA.xml放在一起。这\r
个程序从 exampleA.xml读入数据,作修改(把第一本书作者改成王五)后写入\r
exampleB.xml。因为中文的编码问题,所以我们需要多一点手续。
quote:

文件Test.java
import java.io.*;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.marshal.*;
public class Test{
    public static void main(String[] args) throws Exception{

        BookList bl = new BookList();
        FileInputStream fis = new FileInputStream("exampleA.xml");

        try{
            bl = bl.unmarshal(fis);
        }finally{
            fis.close();
        }
        List books = bl.getBook();
        Book b = (Book)books.get(0);
        b.setAuthor("王五\\");

        bl.validate();  //先验证,不然marshal会出错\
        FileOutputStream fos = new FileOutputStream("exampleB.xml");
        XMLWriter xw = new XMLWriter(fos,"GBK");
        try{
            bl.marshal(xw);
        }finally{
            fos.close();
        }
    }
}



编译运行,生成的文件exampleB.xml如下:
quote:



<booklist></booklist>
  <book></book>
    <name></name>Java编程入门
    <author></author>王五
     <publishdate></publishdate> 2002-6-6
     <price></price> 35.0
  <book></book>
    <name></name>XML在Java中的应用
    <author></author>李四
     <publishdate></publishdate> 2002-9-16
    <price></price> 92.0
  




5 更进一步:数据类型转换
你可能已经注意到在上面的例子中,生成的Book对象的getPrice方法返回的是
String,实际上它应该是float。同样publishDate以该是日期类型,而不是字符\r
串。这是因为我们的绑定模式写得太简单了,模式编译器生成了默认的String类型。现在我们这样写:
quote:

文件bookList2.xjs

    
    
    
                 parse="TransDate.parseDate" print="TransDate.printDate"/>




用java com.sun.tools.xjc.Main bookList.dtd bookList2.xjs运行编译器。
生成的Book文件的相应代码为:
float getPrice()
java.util.Date getPublishDate()

bookList2.xjs第3行将Price转换成了float类型,float类型是一个简单类型,因\r

此用convert="float"描述就可以了。而 publishDate需要转变成
java.util.Date,这是一个类,而且他没有以字符串作为参数的构造函数。
parse="TransDate.parseDate"就表示使用unmarshal读取数据的时候,会\r
调用TransDate.parseDate()方法。这个静态方法以字符串为参数,返回
java.util.date。print="TransDate.printDate"的作用相反。TransDate这\r
个类需要我们提供。
quote:

文件TransDate.java
import java.util.Date;
public class TransDate {
    private static java.text.SimpleDateFormat df 
        = new java.text.SimpleDateFormat("yyyy-MM-dd");

    public static Date parseDate(String d) {
        try {
            return df.parse(d);
         } catch (java.text.ParseException pe) {
            System.out.print(pe);
            return new Date();
        }
    }

    public static String printDate(Date d) {
        return df.format(d);
    }
}



6 那些使JAXB能够做到,但本文没有提到的
本文提供的这个例子很简单,实际上JAXB还可以定义文档的哪些元素(属性)可
以被转换成类,哪些被转换成类的属性。处理元素的属性。处理枚举值。为一些元
素共同的子元素生成接口(因为JAXB不支持NameSpace),定义继承结构等
等。

7 JAXB不能做到的
Sun的文档里提到的:
仅支持用DTD定义XML
不支持NameSpace
不支持内部子集、NOTATIONs、ENTITY、ENTITIES等。

另外,我发现如果要写一条处理指令到XML文档中,例如指定转换的样式单



在JAXB中好像做不到,在javax.xml.marshal.XMLWriter中有一个chars
(String str)方法,可以把字符串到XML文件的声明后面,但是这个方法对特殊字
符作了转义,也就是没办法可以做到。这很奇怪,因为这是一个常用的功能,要实
现也不难。也许还有我没有发现的办法。倒是有一个doctype方法可以写
DOCTYPE声明。


8 参考文档
1 The Java ™ Architecture for XML Binding User’s Guide
 (http://java.sun.com/xml/jaxb/jaxb-docs.pdf)
2 Web Services Made Easier. The Java TM APIs and Architectures 
for XML, A Technical White Paper 
(http://java.sun.com/xml/webservices.pdf )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值