`
crazyox
  • 浏览: 185068 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

使用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 )
分享到:
评论

相关推荐

    使用JAXB处理XML文档WORD版最新版本

    本文档主要讲述的是使用JAXB处理XML文档;以简短的篇幅介绍了JAXB的基本使用,希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

    JAXB 生成XML文件

    Java Architecture for XML Binding (JAXB) 是Java平台上的一个标准技术,用于在Java对象和XML文档之间进行数据绑定。它允许开发人员通过简单的注解(annotations)将Java类与XML Schema映射,从而实现XML文档的序列...

    JAVA JAXB 解析XML嵌套子节点为字符串

    使用JAXB解析XML时,我们首先需要创建一个Java类模型,这个模型反映了XML文档的结构。每个XML元素对应一个Java类,类的属性对应元素的属性或子元素。例如,如果XML中有以下结构: ```xml &lt;text&gt;Some text here ...

    利用JAXB进行xml和javabean之间转换

    - **处理命名空间**:使用`@XmlSchema`注解可以指定XML文档的命名空间。 - **处理属性和元素**:通过`@XmlAttribute`和`@XmlElement`注解控制数据是作为属性还是元素序列化。 总之,JAXB是Java开发中处理XML的强大...

    jaxb生成XML例子

    它使得开发者能够轻松地将Java对象模型映射到XML文档,并反之亦然。在给定的例子中,我们将深入理解如何使用JAXB注解来生成XML。 1. **@XmlType**: 这个注解用于定义类的属性在XML输出中的顺序。在`WriterXml`类中...

    webservice之使用jaxb把xml转换Object或把对象转换成xml文件

    3. 解析XML:有了Java类,我们就可以使用JAXB提供的`Unmarshaller`接口将XML文档解析成Java对象。以下是一个简单的示例: ```java JAXBContext jaxbContext = JAXBContext.newInstance(User.class); Unmarshaller ...

    使用jaxb根据xsd生成xml文档

    **使用JAXB根据XSD生成XML文档** ...这个过程包括创建XSD文件、生成Java类、配置JAXB绑定、创建和填充Java对象,最后使用`Marshaller`生成XML文档。了解并熟练掌握这一流程,能够极大地提高XML处理的效率和准确性。

    最新JAXB解析XML教程

    JAXB为开发人员提供了一种简单、高效的方式,使得在Java应用程序中处理XML文档变得更为便捷。通过JAXB,你可以将XML Schema定义的数据模型直接映射到Java类,反之亦然,从而方便地在XML和Java对象之间进行转换。 在...

    利用jaxb实现xml和bean互转

    它允许开发者将XML文档转换为Java对象,反之亦然,从而简化了XML处理。JAXB是Java SE和Java EE的一部分,提供了一种自动化的、类型安全的方式来序列化和反序列化XML数据。 **一、JAXB的基本概念** 1. **Java Bean*...

    stax+jaxb进行xml解析

    这种方式降低了内存使用,提高了处理大型XML文档的效率。Woodstax是StAX的一种实现,提供了更高效、更易用的API。 JAXB则是一种对象到XML和XML到对象的绑定框架,它可以将Java对象转换为XML,并将XML数据转换回相应...

    idea 中用jaxb 读xml中数据

    JAXB是Java标准API,它提供了将Java对象与XML文档之间进行自动转换的能力。通过JAXB,我们可以在Java对象和XML之间进行无缝的数据绑定,大大简化了XML的处理工作。在Idea中使用JAXB,我们需要遵循以下步骤: 1. **...

    java 使用 JAXB 将xml转换为 bean 包含xml和dto和读取文件的util类

    Java中的JAXB(Java Architecture for XML Binding)是一个用于在Java对象和XML文档之间进行映射的标准API。这个技术使得开发者可以方便地将XML数据转换为Java对象,反之亦然。在给定的压缩包文件中,可能包含了实现...

    jaxb (XML操作)

    **JAXB(Java Architecture for XML Binding)** 是Java平台中用于处理XML的一种强大的工具,它提供了将XML文档与Java对象之间的映射,从而方便XML数据的解析和生成。通过JAXB,开发者可以轻松地实现XML数据到Java...

    JAXB与xml相互转换实例

    当我们有一个Java对象,并希望将其转换成XML格式时,JAXB会使用已有的Java类和XML Schema信息来生成符合Schema规范的XML文档。这个过程可以通过调用`JAXBContext`的`createMarshaller()`方法创建一个marshaller对象...

    jaxb解析xml为对象例子

    Java Architecture for XML Binding(JAXB)是Java平台的标准API,它允许开发者将Java对象绑定到XML文档,以及将XML文档解绑回到Java对象。这个过程称为对象-XML绑定,简化了XML数据处理,使得开发者可以更专注于...

    jaxb解析xml

    JAXB提供了一种便捷的方式来解析XML文档,将XML数据映射到Java对象上,这样开发者可以更直观地操作和处理数据。 2. **Java对象与XML之间的映射**:JAXB的核心功能就是建立Java类和XML元素之间的映射关系。这通常...

    jaxb解析生成xml

    2. **内存消耗**:在处理大型XML文档时,JAXB可能会占用大量内存,因为它会将整个文档加载到内存中。 3. **灵活性**:与DOM或SAX相比,JAXB可能不那么灵活,因为它需要预先知道整个XML结构。 总的来说,JAXB是Java...

    使用jaxb将XML转化为JAVA BEAN

    JAXB基于Java反射机制,通过在Java类上使用特定的注解(如@XmlRootElement、@XmlElement等),JAXB可以自动地将这些类实例序列化为XML文档,或者将XML文档反序列化为Java对象。这个过程分为两个主要步骤: ...

    jaxb xml 转map

    在Java世界中,JAXB(Java Architecture for XML Binding)是一个标准的API,用于将XML文档与Java对象之间进行互相转换。这个过程被称为对象绑定。在处理XML数据时,JAXB提供了一种方便的方式,让我们可以将XML数据...

Global site tag (gtag.js) - Google Analytics