XMLBeans是Bea公司的一个项目,用于访问和处理数据和文档。使用XMLBeans可以让您用面向对象的观点来对待和处理xml
数据和文档,同时又可以忠实于该
xml
数据对应的
xml
结构和
schema
。本文中作者简单的介绍了
XMLBeans
,并且给出了一个简单的例子,详细的演示了如何配置
XMLBeans
使它正常运行的全部过程。 XMLBeans来自于Bea,是使用java技术访问和处理XML数据和文档技术的一次突破性进展。第一次,开发者可以用自己熟悉的、方便的、面向对象的视图来看待XML数据,同时又可以访问该数据对应的结构和schema。
――来自于Bea
的关于XMLBeans
的介绍
XMLBeans是Bea公司针对XML处理的一个项目,现在已经提供免费下载和使用,目前的最新版本是1.0。
1 为什么使用XMLBeans
在XMLBeans之前,我们访问xml数据和文档有两种选择:
1. 使用DOM、SAX来访问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工具并使它正常运行。
XMLBeans的java实现请大家到bea的网站上下载:http://dev2dev.bea.com/technologies/xmlbeans/index.jsp
在执行过程中,还需要用访问xml的dom组件,也就是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
>
GladysKravitz
</
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'sCelestialHandbook,Vol1
</
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'sCelestialHandbook,Vol2
</
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
编译脚本执行时候必须增加一个XMLBean的taskdef,内容如下:
<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"
>
<!--
Createthebuilddirectorystructureusedbycompile
-->
<
mkdir
dir
="${build}"
/>
</
target
>
<
target
name
="compile"
depends
="init"
>
<!--
Compilethejavacodefrom${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文档
PurchaseOrderDocumentpoDoc
=
PurchaseOrderDocument.Factory.parse(poFile);
//
创建一个访问该xml实例文档的接口PurchaseOrder
/***/
/**[注]让作者感到很意外的是,bea提供的例子代码中这段的定义是这样的:
*PurchaseOrderpo=poDoc.getPurchaseOrder();
*也就是说PurchaseOrder这个接口应该是一个单独的类,但是作者查看XMLBeans
*最后生成的.java文件中,这个PurchaseOrder却是作为PurchaseOrderDocument的一
*个内部类出现的
*/
PurchaseOrderDocument.PurchaseOrderpo
=
poDoc.getPurchaseOrder();
//
直接过去其中的所有lineitem子元素的所有内容,他返回一个lineitem对象的数组.
LineItem[]lineitems
=
po.getLineItemArray();
System.out.println(
"
Purchaseorderhas
"
+
lineitems.length
+
"
lineitems.
"
);
double
totalAmount
=
0.0
;
int
numberOfItems
=
0
;
//
直接使用对应的get方法来获取对应属性的值
for
(
int
j
=
0
;j
<
lineitems.length;j
++
)
...
{
System.out.println("Lineitem:"+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(
"
Totalitems:
"
+
numberOfItems);
System.out.println(
"
Totalamount:
"
+
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 总结
XMLBeans是Bea公司的一个公开源代码项目,以Schema为基础建立的、访问xml的一种解决方法,提供了访问和处理xml数据和文档时既可以完全的访问xml的内容、又不丢失xml的schema信息的强大功能。使用XMLBeans可以让您用面向对象的观点来对待和处理xml数据和文档,同时又可以忠实于该xml数据对应的xml结构和schema。
本文中作者简单的介绍了XMLBeans,并且给出了一个简单的例子,详细的演示了如何配置XMLBeans,如何使用他的ant扩展辅助生成访问xml的java代码,如何编写客户端来测试该段代码是否成功执行的全过程。希望能够让大家掌握如何使用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,[email protected]