产品中心

新闻邮件订阅

IT要闻
产品评测
技巧推荐
社区精华
请输入您的e-mail地址:

使用技巧 - How to Use

 您的位置:首页 > 使用技巧 > 编程 软件
使用SDO跟踪XML数据的变化
上篇
佚名 天新网 | 2008-03-03 11:43:22 |

引:本文给出了一个使用Apache SDO处理XML数据的例子。由于SDO现在还不是处理XML的标准的解决方案,因此,本文还讨论了SDO中的基本的操作XML数据的方法。

    本文给出了一个使用Apache SDO处理XML数据的例子。由于SDO现在还不是处理XML的标准的解决方案,因此,本文还讨论了SDO中的基本的操作XML数据的方法。

    跟踪数据的变化在很多软件、应用程序和商业场景中是一个基本的要求。如果要严格地实现这个需求是非常困难的,这主要是因为对文件的不同变化建模,并监视这些变化一般很难做到。从另一方面讲,在所有的程序中反复地实现这种功能要比将一个单独的模块应用到不同的应用程序中更经济实用。而服务数据对象(SDO),这个由BEA和IBM定义的异构数据访问解决方案,为开发人员提供了更容易实现的机制来从系统层跟踪数据的变化。

    一、处理XML数据的三个阶段

    在本文给出的处理XML的例子分为三个不同的阶段,这些阶段如下:

    1. 建立

    2. 处理

    3. 浏览

    XML数据可以通过一个文件系统在这三个阶段之间进行传输。在本例的中心场景如下:第二步需要记录XML文件在第一阶段被建立的记录,当第三步浏览XML数据时,人们总希望知道这个文件有哪些变化。如果我们使用Word的跟踪特性,我们将会立即获得这些变化的值。

    许多应用程序都有这些需求,包括实现并发控制、离线应用程序的同步,商业进程管理(BPM)系统。这部分将演示SDO如何帮助我们更容易地实现这些需求。

    本文提供的XML数据是一个订购数据,代码如下:

   

 <?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.example.com/PO"
targetNamespace="http://www.example.com/PO">

<xsd:import namespace="commonj.sdo/xml" schemaLocation="sdo.xsd"/>
    <xsd:element name="purchaseOrder" type="PurchaseOrderType"/>
    <xsd:element name="comment" type="xsd:string"/>

<xsd:complexType name="PurchaseOrderType">
        <xsd:sequence>
            <xsd:element name="shipTo" type="USAddress"/>
            <xsd:element name="billTo" type="USAddress"/>
            <xsd:element ref="comment" minOccurs="0"/>
            <xsd:element name="items"  type="Items"/>
        </xsd:sequence>
        <xsd:attribute name="orderDate" type="xsd:date"/>
    </xsd:complexType>
    <xsd:complexType name="StatusType">
        <xsd:sequence>
            <xsd:element name="status"   type="xsd:string"/>
            <xsd:element name="contact"   type="xsd:string"/>
            <xsd:element name="changeDate" type="xsd:date"/>
        </xsd:sequence>
    </xsd:complexType>

<xsd:complexType name="USAddress">
        <xsd:sequence>
            <xsd:element name="name"   type="xsd:string"/>
            <xsd:element name="street" type="xsd:string"/>
            <xsd:element name="city"   type="xsd:string"/>
            <xsd:element name="state"  type="xsd:string"/>
            <xsd:element name="zip"    type="xsd:decimal"/>
        </xsd:sequence>
        <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/>
    </xsd:complexType>
    <xsd:complexType name="Items">
        <xsd:sequence>
            <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="productName" type="xsd:string"/>
                        <xsd:element name="price"  type="xsd:decimal"/>
                        <xsd:element name="quantity">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:positiveInteger">
                                    <xsd:maxExclusive value="100"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>
                        <xsd:element ref="comment"   minOccurs="0"/>
                        <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
                    </xsd:sequence>
                    <xsd:attribute name="partNum" type="SKU" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

<xsd:simpleType name="SKU">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="\d{3}-[A-Z]{2}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

 

   CreatePO.java类完成了建立XML的工作。代码如下

   

 package com.company.sdo.po;
import commonj.sdo.DataObject;
import commonj.sdo.helper.DataFactory;
public class CreatePO {
public static void main(String[] args) throws Exception {
//1.  使用XSD定义类型和属性
     Util.definePOTypes();
//2.  建立根DataObject
     DataObject purchaseOrder =
DataFactory.INSTANCE.create(Constants.PO_NAMESPACE, "PurchaseOrderType");
//3.  设置根DataObject的数据类型属性
     purchaseOrder.setString("orderDate", "1999-10-20");
//4.  建立子DataObject
     DataObject shipTo = purchaseOrder.createDataObject("shipTo");
//5.  设置子DataObject的数据类型属性
     shipTo.set("country", "US");
shipTo.set("name", "Alice Smith");
shipTo.set("street", "123 Maple Street");
shipTo.set("city", "Mill Valley");
shipTo.set("state", "CA");
shipTo.setString("zip", "90952");
DataObject billTo = purchaseOrder.createDataObject("billTo");
billTo.set("country", "US");
billTo.set("name", "Robert Smith");
billTo.set("street", "8 Oak Avenue");
billTo.set("city", "Mill Valley");
billTo.set("state", "PA");
billTo.setString("zip", "95819");
purchaseOrder.set("comment", "Hurry, my lawn is going wild!");
DataObject items = purchaseOrder.createDataObject("items");
//6.  为子DataObject “item”建立一个子DataObject
     DataObject item1 = items.createDataObject("item");
item1.set("partNum", "872-AA");
item1.set("productName", "Lawnmower");
item1.setInt("quantity", 1);
item1.setString("price", "148.95");
item1.set("comment", "Confirm this is electric");
DataObject item2 = items.createDataObject("item");
item2.set("partNum", "926-AA");
item2.set("productName", "Baby Monitor");
item2.setInt("quantity", 1);
item2.setString("price", "39.98");
item2.setString("shipDate", "2007-11-21");
DataObject item3 = items.createDataObject("item");
item3.set("partNum", "998-AA");
item3.set("productName", "Carpet");
item3.setInt("quantity", 1);
item3.setString("price", "439.98");
item3.setString("shipDate", "2007-12-01");
//7.  将XML数据保存在一个XML文件中
     Util.storeXML(purchaseOrder,"purchaseOrder", Constants.PO_XML);
}
}

    1. 使用XSD定义类型和属性;由于我们的数据是基于XML格式的,因此,我们首先需要在运行时定义SDO类型的属性。这个功能由Util类的definePOTypes()方法完成。在definePOTypes方法内部调用了XSDHelper类。definePOTypes()方法的代码如下:

   

 public static void definePOTypes() throws Exception {
FileInputStream fis = new FileInputStream(PO_MODEL_ORIGINAL);
XSDHelper.INSTANCE.define(fis, null);
fis.close();
}

    2. 建立根数据对象:SDO的动态API可以通过数据对象的层次和属性或是一个DataGraph(包含了数据对象元数据的一个图)来描述结构化数据。SDO提供了用于建立一个未连接的数据对象的DataFactory接口。

    3. 设置根数据对象的数据类型属性:订购单在SDO中是一个类型,并且根据schema,它有一个叫orderDate的数据类型属性,这是一个日期类型。

    4. 建立子数据对象:数据对象订购单有一些子数据对象。例如,上面代码中的注释4在purchaseOrder中建立shipTo子结点。除了这种方法,我们还可以使用DataFactory来建立一个未连接的shipTo数据对象,并使用setDataObject方法将他设置成purchaseOrder的一个子结点。代码如下:

    DataObject shipTo = DataFactory.INSTANCE.create(CONSTANTS.PO_NAMESPACE, "USAddress");
           ......
    PurchaseOrder.setDataObject("shipTo", shipTo);

    5. 设置子对象结点的数据类型属性:基于USAddress类型的定义,shipTo数据对象有不同的数据类型属性。上面注释5建立了这些属性。

    6. 为子数据对象“item”建立一个子数据对象:这部分显示了建立XML时SDO数据模型。

    在下一部分将讨论如何使用SDO的动态API,我们可以编辑订购单,并且在同时跟踪他们的变化。

 
 
下一页:下篇
 
1 2 下一页 >> 末页 推荐】【打印
 
相关文章
· 谷歌:微软OOXML文档标准完全多余 2008-02-27 09:17:25
· 聚焦 DB2 的XML能力 2008-02-25 09:39:54
· IBM部分产品支持微软OOXML文档格式 2008-01-21 16:12:14
· DB2 XML 编程之 XML 数据模型 2008-01-14 09:54:37
· 基于pureXML的数据库表结构扩展 2007-12-28 10:41:41
 
 
PCWorld社区

网友评论
以下网友评论只代表网友个人观点,不代表PCWorld观点
发表内容:

SPONSORED LINKS

联想M930一体机体验专区
5月15日,联想率先在喷墨一体机市场上发布了针对soho用户和小型办公类市场为主打……
联想外设数码业务百城巡展
传承奥运品质 倾心百城服务
爱普生3LCD联盟
了解3LCD已经汇集了3LCD技术精英的联盟站点
全方位深入的存储资讯
从企业级到个人应用,从业界动态到大型评测,带您尽览存储风云
享受高质量低成本的照片打印
联想4330照片打印机,打印成本仅需1元
尚品·人生网
尚品·人生网,让优质生活与事业和谐平衡
中华部落阁
加入中华部落阁,记录你的新生活。
润眼电脑“3H高清润眼屏”
免费体验,火热报名,海尔润眼电脑系列。
万元级彩色激光一体机
爱普生彩色激光多功能一体机CX11系列专区
联想投影机全球同一品质
新联想一周年庆典 新投影共享全球同一品质
关于我们投稿指南 公告 注册 诚信与安全 规则与政策 友情链接 网站地图 IDG全球资源 业务联系 68130909-6865 《微电脑世界》2009刊例
Copyright(c) 2000-2008 pcworld.com.cn. All Rights Reserved. 京ICP备 05038969 号