科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件SDO 2.0:创建和读取基于XML模式的XML文档

SDO 2.0:创建和读取基于XML模式的XML文档

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Service Data Object (SDO) 2.0 是一个开放标准数据模型编程 API,允许开发人员在较高的级别方便地操作数据。尽管 SDO 1.0 以相同的数据抽象为目标,但有几个大的缺点。

作者:Fuhwei Lwo 来源:论坛整理 2007年12月3日

关键字: 软件

  • 评论
  • 分享微博
  • 分享邮件
创建 XML 格式的示例 PO

  清单 2 中所示的示例 CreatePurchaseOrder.java 程序用于创建一个 PO,该 PO 采用名为 po.xml 的 XML 格式(如清单 3 所示)。

  清单 2. CreatePurchaseOrder.java

 
/**
 * Author: Fuhwei Lwo
 */
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.OutputStream;

import commonj.sdo.DataObject;
import commonj.sdo.helper.DataFactory;
import commonj.sdo.helper.XMLHelper;
import commonj.sdo.helper.XSDHelper;

public class CreatePurchaseOrder {
  private static final String PO_MODEL = "po.xsd";
  private static final String PO_NAMESPACE = "http://www.example.com/PO";
  private static final String PO_XML = "po.xml";

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

 public static void main(String[] args) throws Exception {
  definePOTypes();
      
  DataObject purchaseOrder = 
    DataFactory.INSTANCE.create(PO_NAMESPACE, "PurchaseOrderType");
  
  purchaseOrder.setString("orderDate", "1999-10-20");
  
  DataObject shipTo = purchaseOrder.createDataObject("shipTo");
  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");
  
  DataObject item1 = items.createDataObject("item");
  item1.set("partNum", "872-AA");
  item1.set("productName", "Lawnmower");
  item1.setInt("quantity", 1);
  item1.setString("USPrice", "148.95");
  item1.set("comment", "Confirm this is electric");
  
  DataObject item2 = items.createDataObject("item");
  item2.set("partNum", "926-AA");
  item2.set("productName", "Baby Monitor");
  iteim2.setInt("quantity", 1);
  item2.setString("USPrice", "39.98");
  item2.setString("shipDate", "1999-05-21");
  
  OutputStream stream = new FileOutputStream(PO_XML);
  XMLHelper.INSTANCE.save(purchaseOrder, PO_NAMESPACE, "purchaseOrder", stream);
 }
}

  清单 3. Po.xml

 
<?xml version="1.0" encoding="ASCII"?>
<po:purchaseOrder xmlns:po="http://www.example.com/PO" orderDate="1999-10-20">
  <shipTo country="US">
    <name>Alice Smith</name>
    <street>123 Maple Street</street>
    <city>Mill Valley</city>
    <state>CA</state>
    <zip>90952</zip>
  </shipTo>
  <billTo country="US">
    <name>Robert Smith</name>
    <street>8 Oak Avenue</street>
    <city>Mill Valley</city>
    <state>PA</state>
    <zip>95819</zip>
  </billTo>
  <comment>Hurry, my lawn is going wild!</comment>
  <items>
    <item partNum="872-AA">
      <productName>Lawnmower</productName>
      <quantity>1</quantity>
      <USPrice>148.95</USPrice>
      <comment>Confirm this is electric</comment>
    </item>
    <item partNum="926-AA">
      <productName>Baby Monitor</productName>
      <quantity>1</quantity>
      <USPrice>39.98</USPrice>
      <shipDate>1999-05-21</shipDate>
    </item>
  </items>
</po:purchaseOrder>

  该示例 Java 程序首先通过调用 XSDHelper.INSTANCE.define() 方法向 SDO 运行时注册 po.xsd 中描述的所有类型。然后,它从 PurchaseOrderType 创建一个根 DataObject。该程序将从该处使用 DataObject API 来构建 DataObject 树,以表示购买订单信息,如图 3 中所示。

  图 3. DataObject 树

  DataObject 树

  在图 3 中,每个矩形都划分为两个隔间。顶部间隔(灰色)指示 DataObject 实例名称及其实际类型;底部间隔指示所包含的属性。例如,树的根元素为 purchaseOrder DataObject 实例;其实际类型为 PurchaseOrderType,在清单 1 中的 PO.xsd 中定义。在此 DataObject 实例中,包含两个属性值——orderDate 和 comment。

  创建 DataObject 树后,该程序调用 XMLHelper.INSTANCE.save() 方法来将从 purchaseOrder DataObject 实例开始的树内容保存到 XML 文档中(此例中为 po.xml)。事实上,可以将树中任何 DataObject 实例指定为 XMLHelper.INSTANCE.save() 方法的第一个参数,save() 方法将保存从所指定的实例开始的所有 DataObject 实例。

  读取示例 PO

  CreatePurchaseOrder.java 创建了 po.xml 后,我们可以编译并运行清单 4 中所示的 ReadPurchaseOrder.java,以演示如何使用 SDO API 来遍历 po.xml 的内容。该应用程序将执行以下操作:

  进行检查,以确保已向 SDO 运行时注册了 po.xsd 中定义的类型

  调用 XMLHelper.load() 方法来将 po.xml 加载到内存中(使用 XMLDocument 实例 xmlDoc 加以表示)

  调用 xmlDoc.getRootObject() 方法来检索名为 purchaseOrder 的 DataObject 树的根对象,该对象与图 3 中所示的 DataObject 树关系图中的 purchaseOrder DataObject 对应

  purchaseOrder DataObject 返回后,遍历 DataObject 树,以检索关于此 PO 的所有信息

  清单 4. ReadPurchaseOrder.java

 
/**
/**
 * Author: Fuhwei Lwo
 */
import java.io.FileInputStream;
import java.util.List;

import commonj.sdo.DataObject;
import commonj.sdo.helper.XMLDocument;
import commonj.sdo.helper.XMLHelper;
import commonj.sdo.helper.XSDHelper;


public class ReadPurchaseOrder {
 private static final String PO_MODEL = "po.xsd";
 private static final String PO_XML = "po.xml";

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

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

    FileInputStream fis = new FileInputStream(PO_XML);

    XMLDocument xmlDoc = XMLHelper.INSTANCE.load(fis);

    DataObject purchaseOrder = xmlDoc.getRootObject();
    
           System.out.println("Order date: " + purchaseOrder.get("orderDate"));
          System.out.println("Comment: " + purchaseOrder.get("comment"));

    DataObject shipTo = purchaseOrder.getDataObject("shipTo");
    System.out.println("Ship to name: " + shipTo.get("name"));

   DataObject billTo = purchaseOrder.getDataObject("billTo");
           System.out.println("Bill to name: " + billTo.get("name"));
          System.out.println();

            DataObject items = purchaseOrder.getDataObject("items");
            List itemList = items.getList("item");
            for (int i=0; i<itemList.size(); i++) {
        
         DataObject item = (DataObject)itemList.get(i);
   
         System.out.println("Part num: " + item.get("partNum"));S
        System.out.println("Product name: " + item.get("productName"));
    } // for
  }
}

  清单 4 中以黑体显示的 System.out.println() 显示各种数据对象的属性值,包括:

  • purchaseOrder DataObject 的 orderDate 和 comment 属性
  • shipTo DataObject 的 name 属性
  • billTo DataObject 的 name 属性
  • 各种数据对象的 partNum 和 productName 属性

  图 4. 运行 ReadPurchaseOrder 的控制台输出

 Order date: 1999-10-20

Comment:Hurry, my lawn is going wild!
Ship to name:Alice Smith
Bill to name:Robert Smith

Part num:872-AA
Product name:Lawnmower

Part num:926-AA
Product name:Baby monitor

  在图 4 中,我们可以看到运行 ReadPurchaseOrder Java 代码的输出。

  结束语:SDO 将成为事实上的数据模型编程 API

  SDO 2.0 API 提供了创建和访问数据的一致方式,使开发人员不必了解分析和维护数据完整性的底层实现细节。SDO 2.0 目前是 Apache Software Foundation 下的一个试验性子项目(称为 Tuscany),预期将成为 SOA 开发的数据模型编程 API 的事实标准。

  可以从上面的示例中看出,SDO 2.0 API 使您完全不必知道和使用 XML 解析器 API 来读取、写入和操作数据。如果使用 Java 创建了 DataObject 来表示符合您所定义的 XML 模式的 XML 数据,SDO 2.0 将提供足够的方便性和灵活性,让您将精力放在如何使用数据上。因此,它可为您带来极大的好处,从而提高开发工作效率和产品质量。

  总之,通过使用 SDO 2.0 提供的数据抽象技术,您可以根据所定义的业务逻辑来处理数据,以满足您的业务需求。这可以帮助您简化业务应用程序开发,也能提高团队的工作效率和工作质量。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章