支付宝展雄

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

XMLBeans是Bea公司的一个项目,用于访问和处理数据和文档。使用XMLBeans可以让您用面向对象的观点来对待和处理xml数据和文档,同时又可以忠实于该xml数据对应的xml结构和schema。本文中作者简单的介绍了XMLBeans,并且给出了一个简单的例子,详细的演示了如何配置XMLBeans使它正常运行的全部过程。

 

XMLBeans来自于Bea,是使用java技术访问和处理XML数据和文档技术的一次突破性进展。第一次,开发者可以用自己熟悉的、方便的、面向对象的视图来看待XML数据,同时又可以访问该数据对应的结构和schema。                                 ――来自于Bea的关于XMLBeans的介绍

XMLBeansBea公司针对XML处理的一个项目,现在已经提供免费下载和使用,目前的最新版本是1.0

1 为什么使用XMLBeans

XMLBeans之前,我们访问xml数据和文档有两种选择:

1. 使用DOMSAX来访问XML数据和文档的内容

2. 使用JAXB等技术将XML映射为java

不管你使用哪一种,你都无法完整的访问该XML数据和对象的丰富内容和Schema信息。产生的原因是因为java数据模型和XML之间不匹配造成的,所以应用中你要不就选择了可扩展性,要不就只能选择系统的强壮性。

随着XMLBeans的出现,我们不需要再采取这种折衷的措施了。XMLBeans提供了更多的特性来访问XML数据和文档:

1.   XMLBeans是基于标记流,因此可以轻松的使用指针在xml数据和文档之间导航。指针接口适用于所有xml数据和文档。

2.   如果你的xml数据和文档有一个schema的话,XMLBeans将给您生成这些XML数据和文档的java类“视图”(也就是访问这些XML数据和文档的java代码)。

3.   开发者可以使用这些java代码轻松的读/写xml数据和文档,而且被强制的执行xml schema中规定的一些约束。

4.   java类“视图”都能够忠实的表述原始xml数据和文档的内容,因为java类“视图”都是基于受保护的、最基本的xml表现。

所以使用XMLBeans来访问xml 数据和文档的好处是显而易见的:

1.   完全使用面向对象的观点来看待和处理数据和文档

2.   开发者不再需要编写大量的代码来访问XML数据和文档

3.   可以使用schema中规定的对于数据的约束条件,而不需要自己去编写实现这些约束的代码

4.   不需要解析所有的xml数据和文档而仅仅是为了访问其中的某个数据项

关于XMLBeans更详细的情况请大家访问http://dev2dev.bea.com/technologies/xmlbeans/

2 环境和工具准备

XMLBeans中的大量工作使用了Ant工具,所以再开始工作之前请下载Ant工具并使它正常运行。

XMLBeansjava实现请大家到bea的网站上下载:http://dev2dev.bea.com/technologies/xmlbeans/index.jsp

在执行过程中,还需要用访问xmldom组件,也就是xml-apis.jar文件,可到http://xml.apache.org/xerces2-j/index.html下载。附件中的test-XMLBeans.rar文件中也有这个jar文件。

3 第一个例子

3.1    实例说明

我们这里使用一个订单的例子,他的实例文档如下:schema来描述这个实例文档:

<po:purchase-order xmlns:po=" http://vivianj.go.nease.net/easypo ">
    
<po:customer>
  
<po:name>Gladys Kravitz</po:name>
  
<po:address>Anytown, PA</po:address>
    
</po:customer>
    
<po:date>2003-01-07T14:16:00-05:00</po:date>
    
<po:line-item>
  
<po:description>Burnham's Celestial Handbook, Vol 1</po:description>
  
<po:per-unit-ounces>5</po:per-unit-ounces>
  
<po:price>21.79</po:price>
  
<po:quantity>2</po:quantity>
    
</po:line-item>
    
<po:line-item>
  
<po:description>Burnham's Celestial Handbook, Vol 2</po:description>
  
<po:per-unit-ounces>5</po:per-unit-ounces>
  
<po:price>19.89</po:price>
  
<po:quantity>2</po:quantity>
    
</po:line-item>
<po:shipper>
  
<po:name>ZipShip</po:name>
  
<po:per-ounce-rate>0.74</po:per-ounce-rate>
    
</po:shipper>
</po:purchase-order>

我们使用下面的

xml数据已经确定了,而且已经用schema来描述他了,剩下的就是使用XMLBeans来辅助生成访问XML数据的java代码了,下面的章节将详细的介绍这部分内容

<xs:schema

   
xmlns:xs="http://www.w3.org/2001/XMLSchema"

   xmlns:po
="http://vivianj.go.nease.net/easypo"

   targetNamespace
="http://vivianj.go.nease.net/easypo"

   elementFormDefault
="qualified">

  
<xs:element name="purchase-order">

    
<xs:complexType>

      
<xs:sequence>

  
<xs:element name="customer" type="po:customer"/>

  
<xs:element name="date" type="xs:dateTime"/>

  
<xs:element name="line-item" type="po:line-item" minOccurs="0" maxOccurs="unbounded"/>

  
<xs:element name="shipper" type="po:shipper" minOccurs="0" maxOccurs="1"/>

      
</xs:sequence>

    
</xs:complexType>

  
</xs:element>

  
<xs:complexType name="customer">

    
<xs:sequence>

      
<xs:element name="name" type="xs:string"/>

      
<xs:element name="address" type="xs:string"/>

    
</xs:sequence>

    
<xs:attribute name="age" type="xs:int"/>

  
</xs:complexType>

  
<xs:complexType name="line-item">

    
<xs:sequence>

      
<xs:element name="description" type="xs:string"/>

      
<xs:element name="per-unit-ounces" type="xs:decimal"/>

      
<xs:element name="price" type="xs:decimal"/>

      
<xs:element name="quantity" type="xs:integer"/>

    
</xs:sequence>

  
</xs:complexType>

  
<xs:complexType name="shipper">

    
<xs:sequence>

      
<xs:element name="name" type="xs:string"/>

      
<xs:element name="per-ounce-rate" type="xs:decimal"/>

    
</xs:sequence>

  
</xs:complexType>

</xs:schema>

现在,要访问的

3.2    ant辅助生成访问XML数据的java代码

3.2.1      外部jar文件

在使用XMLBeans生成访问XML数据的java代码时,我们需要用到xbean.jar文件,下载的XMLBeans里面有这个文件。

3.2.2      增加的taskdef

编译脚本执行时候必须增加一个XMLBeantaskdef,内容如下:

<taskdef name="xmlbean" classname="com.bea.xbean.tool.XMLBean" classpath="path/to/xbean.jar"/>

3.2.3      xmlbean

使用xmlbean标签来生成访问xml数据的java代码,简单的例子如下:

schemas下面所有的*.xsd文件生成访问代码,将所有的代码编译好后放入Schemas.jar文件中。

<xmlbean schema="schemas" destfile="Schemas.jar"/>

<xmlbean schema="schemas/easypo.xsd" destfile="Schemas.jar" srcgendir="." />

第一个例子表示为

第二个例子表示为schemas下面所有的easypo.xsd文件生成访问代码,将所有的代码编译好后放入Schemas.jar文件中,而且将生成的。Java文件放在当前目录下。

其中的参数简单的说明如下:

xmlbean 标签表示这是要生成指定schema文件的访问代码。

Schema  属性表示要生成访问代码的xsd文件的范围,可以是一个目录,也可以

是一个文件或者使用fileset进行定义。

Destfile  属性定义了被生成的代码编译后将放在那个文件中。

Rcgendir 属性则表示生成的。Java文件将放在那个目录中。

Xmlbean标签支持的其它参数和相关的说明请参考XMLBeans的帮助文档,这里不作过多的说明。

3.2.4      实际的build.xml

生成jar文件

<project name="MyProject" default="compile" basedir=".">

<property name="src" value="."/>

<property name="build" value="build"/>

<property name="dist"  value="dist"/>

<property name="classpath" value="./xkit/lib/xbean.jar "/>

<target name="init">

    
<!-- Create the build directory structure used by compile -->

    
<mkdir dir="${build}"/>

</target>

<target name="compile" depends="init">

    
<!-- Compile the java code from ${src} into ${build} -->

    
<taskdef name="xmlbean" classname="com.bea.xbean.tool.XMLBean" classpath="${classpath}"/>

    
<xmlbean schema="schemas/easypo.xsd" classpath="${classpath}" destfile="easypo.jar" srcgendir="${src}"/>

  
</target>

</project>

3.2.5     

现在你可以进入build.xml文件所在的目录,执行ant f build.xml来生成所有访问该easypo.xml的代码。

执行完以后,这个目录下面会多出一个Schemas.jar文件,他包含了所有被生成和编译了的、访问xml文档的.class文件。目录下面会多出一个net目录,他的子目录下包含了所有被生成的.java文件.实际的jar文件构成请大家参考作者提供的Schemas.jar文件.

4 测试一下

4.1    测试代码

好了,现在我们来写个例子,测试一下是否可以成功的访问xml数据.完整的代码请参看

测试结果

//解析xml实例文档,他的参数poFile是一个file类型的参数

//所以需要我们将3.1的实例文档保存为一个.xml文档

PurchaseOrderDocument poDoc 
=

      PurchaseOrderDocument.Factory.parse(poFile);

//创建一个访问该xml实例文档的接口PurchaseOrder

/**[注]  让作者感到很意外的是,bea提供的例子代码中这段的定义是这样的:

*PurchaseOrder po = poDoc.getPurchaseOrder();

*也就是说PurchaseOrder这个接口应该是一个单独的类,但是作者查看XMLBeans

*最后生成的.java文件中,这个PurchaseOrder却是作为PurchaseOrderDocument的一

*个内部类出现的

*/


PurchaseOrderDocument.PurchaseOrder po 
= poDoc.getPurchaseOrder();

//直接过去其中的所有lineitem子元素的所有内容,他返回一个lineitem对象的数组.

  LineItem[] lineitems 
= po.getLineItemArray();

  System.out.println(
"Purchase order has " + lineitems.length + " line items.");

  
double totalAmount = 0.0;

  
int numberOfItems = 0;

//直接使用对应的get方法来获取对应属性的值

  
for (int j = 0; j < lineitems.length; j++

  
{

      System.out.println(
" Line item: " + j);

      System.out.println(

    
"   Description: " + lineitems[j].getDescription());

      System.out.println(
"   Quantity: " + lineitems[j].getQuantity());

      System.out.println(
"   Price: " + lineitems[j].getPrice());

      numberOfItems 
+= lineitems[j].getQuantity().intValue();

      totalAmount 
+= lineitems[j].getPrice().doubleValue() * lineitems[j].getQuantity().doubleValue();

  }


  System.out.println(
"Total items: " + numberOfItems);

  System.out.println(
"Total amount: " + totalAmount);

4.2   

运行这段代码,应该在控制台打印如下信息:

Purchase order has 3 line items.

 Line item 0

   Description: Burnham's Celestial Handbook, Vol 1

   Quantity: 2

   Price: 21.79

 Line item 1

   Description: Burnham's Celestial Handbook, Vol 2

   Quantity: 2

   Price: 19.89

Total items: 4

Total amount: 41.68

5 总结

XMLBeansBea公司的一个公开源代码项目,以Schema为基础建立的、访问xml的一种解决方法,提供了访问和处理xml数据和文档时既可以完全的访问xml的内容、又不丢失xmlschema信息的强大功能。使用XMLBeans可以让您用面向对象的观点来对待和处理xml数据和文档,同时又可以忠实于该xml数据对应的xml结构和schema

本文中作者简单的介绍了XMLBeans,并且给出了一个简单的例子,详细的演示了如何配置XMLBeans,如何使用他的ant扩展辅助生成访问xmljava代码,如何编写客户端来测试该段代码是否成功执行的全过程。希望能够让大家掌握如何使用XMLBeans来简化各自的开发工作、提高自己的开发速度。XMLBeans的高级应用将在接下来的文章中介绍。

参考资料:

1. ANT的帮助 http://ant.apache.org/

2. XMLBeans的帮助 http://dev2dev.bea.com/technologies/xmlbeans/

工具下载:

1. ANT工具下载 http://archive.apache.org/dist/ant/binaries/

2. XMLBeans下载  http://dev2dev.bea.com/technologies/xmlbeans/

作者的所有工作文件: test-XMLBeans.rar

作者信息:

姓名: 肖菁

联系方式: 0731-6665772,jing.xiao@chinacreator.com

 

posted on 2007-09-04 23:58  展雄  阅读(2437)  评论(0编辑  收藏  举报