SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

XMLデータの変更をSDOで簡単に追跡する

SDOのJava実装を使ってXMLデータへの変更を追跡する

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルソース (12.6 KB)

SDOを使ってXMLを作成、永続化する

 CreatePO.javaクラス(リスト2を参照)で、このサンプルのXML作成フェーズが完結します。このクラスで特に注目する必要があるのは、コメントが付けられた7ヶ所です。

リスト2 CreatePO.java
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. Define Types and Properties with XSD
     Util.definePOTypes();
     
     //2. Create the root DataObject 
     DataObject purchaseOrder = 
     DataFactory.INSTANCE.create(Constants.PO_NAMESPACE, 
                                 "PurchaseOrderType");
     
     //3. Set data type Property for the root DataObject
     purchaseOrder.setString("orderDate", "1999-10-20");         
     
     //4. Create child DataObjects
     DataObject shipTo = purchaseOrder.createDataObject("shipTo");
     
     //5. Set data type Property for the child 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. Create a child DataObject for the child DataObject “items”
     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. Persist the XML data to an XML file 
     //Util.storeXML(purchaseOrder,"purchaseOrder", 
     //                             Constants.PO_XML_ORIGINAL);
     /*use the following line instead of the above 
      *                   one for tracking changes*/ 
     Util.storeXML(purchaseOrder,"purchaseOrder", Constants.PO_XML);
    }
}
  1. Define Types and Properties with XSD(XSDでデータ型とプロパティを定義する)― データはXMLスキーマによってモデル化されるため、最初に必要なことは、このスキーマに基づいてSDOのデータ型とプロパティをランタイムに定義することです。この操作を行うのは、UtilクラスのdefinePOTypes()メソッドから呼び出されるXSDHelperです。
  2. public static void definePOTypes() throws Exception {
         FileInputStream fis = new FileInputStream(PO_MODEL_ORIGINAL);
         XSDHelper.INSTANCE.define(fis, null);
         fis.close();
    }
    
    (SDO仕様書の9節に、XMLスキーマエンティティからSDOのデータ型およびプロパティへの実際のマッピングが定められています。詳細については、この節を参照してください)。
  1. Create the root DataObject(ルートデータオブジェクトを作成する)― SDOの動的APIは、データオブジェクト階層(オブジェクト別にプロパティを持つ階層)またはDataGraph(データオブジェクトのグラフをメタデータごとパッケージ化したもの)によって構造化データを表します。SDOのDataFactoryインターフェイスを使って未接続のデータオブジェクトを作成できるため、ここで必要な作業は、注文処理のルートデータオブジェクトを作成することです。
  1. Set data type Property for the root DataObject(ルートデータオブジェクトのデータ型プロパティを設定する)― SDOの場合、注文はデータ型です。スキーマの定義に従うと、注文のデータ型プロパティはorderDateであり、これは日付型です。コメント3の下の行で、orderDateに日付の文字列を設定します。これは、JavaのDateオブジェクトを作成し、DataObjectのsetDate()メソッドを使用することに相当します。
  1. Create child DataObjects(子データオブジェクトを作成する)― データオブジェクトpurchaseOrderには、複数の子データオブジェクトがあります。たとえば、コメント4の下の行では、"shipTo"と名前を指定してshipTo子オブジェクトをpurchaseOrderから直接作成します。これは、DataFactoryを使って未接続のshipToデータオブジェクトを作成し、これをDataObjectのいずれかのsetDataObject()メソッドを使ってpurchaseOrderの子として設定することに相当します。
  2. DataObject shipTo
       = DataFactory.INSTANCE.create(CONSTANTS.PO_NAMESPACE, "USAddress");
    ......
    PurchaseOrder.setDataObject("shipTo", shipTo);
    
  1. Set data type Property for the child DataObject(子データオブジェクトのデータ型プロパティを設定する)― USAddressデータ型の定義に従い、shipToデータオブジェクトにはさまざまなデータ型プロパティが与えられます。コメント5の下の行で、これらのプロパティを作成します。
  1. Create a child DataObject for the child DataObject “items”(子データオブジェクト"items"の子データオブジェクトを作成する)― ここでは、XMLをモデル化した場合のSDOデータモデルの階層的な特性について説明します。ItemsはルートデータオブジェクトpurchaseOrderの子であり、これに複数のitemデータオブジェクトの子が含まれます。
  1. Persist the XML data to an XML file(XMLデータをXMLファイルに永続化する)― SDOの動的APIに用意されたXMLHelperインターフェイスを使って、XMLデータをXMLファイルに永続化できます。コメント7の下のコードで、Utilクラスを呼び出し、メソッドを次のように定義します。
  2. public static void storeXML(DataObject data, String rootElementName,
         String xmlFile) throws Exception {
         OutputStream stream = new FileOutputStream(xmlFile);
         XMLHelper.INSTANCE.save(data, PO_NAMESPACE, 
                                 rootElementName, stream);
         }
    

 永続化した注文処理用XMLファイルは、「po_original.xml」という名前です。

 XML用のSDO動的APIは非常に簡単に使用できるため、DOM APIを使って同等の操作を行うよりもずっと便利です。

 次のセクションでは、SDOの動的APIを使って注文処理に改良を加え、変更を追跡できるようにします。

次のページ
XMLデータへの変更を記録する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Young Yang(Young Yang)

ウォール街の金融会社に勤務する上級エンタープライズアーキテクト。数学博士号を取得。IBM社のeビジネスデザイン、DB2管理、ビジネスインテリジェンス、XMLおよび関連テクノロジ、WebSphere Application Serverの認定資格、BEA社のWebLogic Application S...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2225 2008/03/04 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング