使用XKit开发XMLBeans

XMLBeans 允许你以一种友好的方式来操作 XML 文档,它是一种把 XML (可移植的数据)和 JAVA 编程语言(可移植的代码)绑定在一起的工具。它的优点在于:你可以使用 XML 和 XML Schema 灵活性来设计数据模式和接口,然后很自然地把它们映射成对应的 JAVA 语言代码,这样就可以在任何 JAVA 应用环境中访问和修改 XML 实例数据。

  虽然《 dev2dev 创刊号》中已经有一篇文章(《 XMLBeans :两方面都是最佳方案》,以下简称《最佳方案》)对 XMLBeans 作了简单论述,并给了一个订单的例子,但却没有如何使用 XKit 来开发 XMLBeans 的内容,因此本文将侧重于这方面的介绍,所以内容与《最佳方案》并不冲突。

一. XKit的获得及配置

1 .XKit 的获得

  XMLBeans 可以从 BEA 公司的 http://workshop.bea.com/xmlbeans/xmlbeans.zip 站点下载。解压缩后,有一个 xkit 的目录,内容包括:

  
./lib/xbean.jar大小为 3492KB ,是 XMLBeans 的实现类库,支持的 JDK 版本为 JDK1.4.x 。
./binXkit 的全部命令行脚本。
./anttask.htmlantTask 文档
./javadoccom.bea.xml.* 类图
./srcXMLBeans 的源代码
./schemas些 schemas 的例子

2.XKi的配置

  确保安装了 JDK 1.4.x ,并且 java[.exe] 、 javac[.exe] 、 jar[.exe] 在 PATH 中, XMLBeans 的 bin 目录也在 PATH 中。设置环境变量 XMLBEANDIR ,值为 ./lib 目录路径,如在 WINDOWS 下: SET XMLBEANDIR=G:\bea\xkit\lib

二. XKit的使用

1. 编译Schema

  通过执行 scomp 命令来编译 Schema , scomp 的用法为:

  G:\bea\xkit\bin>scomp

  Compiles a schema into XML Bean classes and metadata.

  Usage: scomp [opts] [dirs]* [schema.xsd]* [service.wsdl]* [config.xsdconfig]*

  Options include:

  -cp [a;b;c] - classpath

  -d [dir] - target binary directory for .class and .xsb files

  -src [dir] - target directory for generated .java files

  -srconly - do not compile .java files or jar the output.

  -out [result.jar] ? 指定输出的 Jar 文件名,如 output.jar

  -dl - permit network downloads for imports and includes (default is off)

  -noupa - do not enforce the unique particle attribution rule

  -nopvr - do not enforce the particle valid (restriction) rule

  -quiet - print fewer informational messages

  -license 打印 XMLBeans 的 license 文件内容

  对于《最佳方案》中的 Order.xsd 文件内容为:

  清单 1:Order.xsd

< xs:schema targetNamespace =" http://www.ikigo.com/bods " xmlns =" http://www.ikigo.com/bods " xmlns:xs =" http://www.w3.org/2001/XMLSchema " version =" 1.0 "> 

  < xs:element name =" order ">

   < xs:complexType >

    < xs:sequence >

     < xs:element ref =" header "/>

     < xs:element ref =" lines "/>

    </ xs:sequence >

   </ xs:complexType >

  </ xs:element >

  < xs:element name =" header ">

    < xs:complexType >

      < xs:sequence >

       < xs:element ref =" customer "/>

       < xs:element ref =" po "/>

     </ xs:sequence >

     </ xs:complexType >

  </ xs:element >

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

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

  < xs:element name =" lines ">

    < xs:complexType >

    < xs:sequence >

     < xs:element ref =" line " minOccurs =" 0 " maxOccurs =" unbounded "/>

    </ xs:sequence >

   </ xs:complexType >

  </ xs:element >

  < xs:element name =" line ">

   < xs:complexType >

    < xs:sequence >

     < xs:element ref =" no "/>

     < xs:element ref =" item "/>

     < xs:element ref =" price "/>

     < xs:element ref =" qty "/>

    </ xs:sequence >

   </ xs:complexType >

  </ xs:element >

  < xs:element name =" no " type =" xs:int "/>

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

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

  < xs:element name =" qty " type =" xs:int "/>

</ xs:schema >

  编译 Order.xsd 生成的 Jar 文件为 Order.jar ,命令为:

  G:\bea\xkit\bin>scomp ?out Order.jar Order.xsd

  Loading schema file Order.xsd

  Time to build schema type system: 2.093 seconds

  Time to generate code: 5.918 seconds Compiled types to Order.jar

2. XMLBeans的使用

 确保 xbean.jar, Order.jar 在 CLASSPATH 中。清单 2 是符合 Order.xsd 的示例 XML 文档,我们将编写一个程序来统计这个订单的总费用。

  清单 2:Order.XML

<?xml version="1.0"?> 

< order xmlns =" http://www.ikigo.com/bods ">

  < header >

   < customer > Hitesh Seth </ customer >

   < po > 10001 </ po >

  </ header >

  < lines >

    < line >

     < no > 1 </ no >

     < item > Item 1 </ item >

     < price > 100 </ price >

     < qty > 100 </ qty >

    </ line >

    < line >

     < no > 2 </ no >

     < item > Item 2 </ item >

     < price > 50 </ price >

     < qty > 50 </ qty >

    </ line >

    < line >

     < no > 3 </ no >

     < item > Item 3 </ item >

     < price > 75 </ price >

     < qty > 75 </ qty >

    </ line >

  </ lines >

</ order>

  统计订单总费用的程序为 :

  清单3:TotalPrice.java

import com.bea.xml.*;

import java.io.*;

import com.ikigo.bods.*;

import com.ikigo.bods.LineDocument.*;

import com.ikigo.bods.OrderDocument.*;

public class TotalPrice {

 public static void main(String[] args) throws Exception {

  OrderDocument doc =

  (OrderDocument) OrderDocument.Factory.parse(new File("Order.xml"));

  Order order = doc.getOrder();

  Line[] lines = order.getLines().getLineArray();

  float amt = 0;

  for (int i = 0; i < lines.length; i++) {

   amt += lines[i].getQty() * lines[i].getPrice();

  }

  System.out.println("Order Value: " + amt);

 }

}

  程序中使用了 OrderDocument.Factory.parse() 方法从磁盘文件中构造一个 OrderDocument 对象 doc ,然后通过 doc.getOrder().getLines().getLineArray() 方法得到 line 对象,并通过 FOR 循环统计订单总额。

3. XmlCursor的使用

  XmlCursor代表着 XML 文档中两个逻辑令牌之间的位置。令牌本身不作为对象暴露,但是它们的类型和属性则可以通过 XmlCursor 去引用。使用 XmlCursor ,你可以通过 execQuery() 和 selectPath() 去执行 XQuery 和 XPath 表达式,对 XML 文档作 Inserting, Moving, Copying, Removing 操作。

  使用 XmlCursor 重新改写后的 TotalPrice.java 如清单 4 所示。

  清单4:TotalPrice.java

import com.bea.xml.*;

import java.io.*;

import com.ikigo.bods.*;

import com.ikigo.bods.LineDocument.*;

import com.ikigo.bods.OrderDocument.*;

public class TotalPrice {

 public static void main(String[] args) throws Exception {

  OrderDocument doc =

   (OrderDocument)OrderDocument.Factory.parse(

    new File("Order.xml"));

  Order order = doc.getOrder();

  float amt = 0;

  XmlCursor cursor = order.getLines().newCursor();

  cursor. toFirstChild ();

  do {

   Line line = (Line)cursor.getObject();

   amt += line.getQty() * line.getPrice();

  }

  while (cursor. toNextSibling ());

  System.out.println("Order Value: " + amt);

 }

}

4.XQuery的使用

  使用 XmlCursor 的 execQuery () 方法可以执行 XQuery 语句。使用清单 5 的程序可以列出 Order.xml 文档中订购数量大于 50 的行。

  清单5:XQuery .java

import com.bea.xml.*; 

import java.io.*;

import com.ikigo.bods.*

public class XQuery {

 public static void main(String[] args) throws Exception {

  OrderDocument doc =

   (OrderDocument)OrderDocument.Factory.parse(new File("Order.xml"));

  String query = " declare namespace o='http://www.ikigo.com/bods'";

  query += " //o:line[o:qty>50]";

  XmlCursor cursor = doc.newCursor().execQuery(query);

  System.out.println(cursor.xmlText());

 }

 作者简介
 经乾是(dev2dev ID: jq75) BEA系统(中国)有限公司 渠道部技术顾问

以上是 使用XKit开发XMLBeans 的全部内容, 来源链接: utcz.com/p/205788.html

回到顶部