在 SOA 架构中,程序员经常使用 XML 在应用程序之间交换结构化和半结构化的数据。XML 及其相关技术 — 文档对象模型(Document Object Model,DOM)、XPath、HTTP、XQuery 和可扩展样式表语言转换(Extensible Stylesheet Language Transformations,XSLT) — 为快速应用程序开发提供了一个强大的环境。构建在这些技术之上的应用程序将占用更小的内存空间,需要更低的维护成本,同时又拥有更高的品质和灵活性。
DB2 和其他关系数据库的 XML 方面的特性已经相当成熟,因此除了存储和管理关系数据之外,它们还是存储和管理 XML 数据的理想选择。DB2 9 XML 支持(称为 pureXML)提供了以纯 XML 的形式(换句话说,就是带注释的、树型的分层存储)存储 XML 的能力。在 DB2 9 中,XML 数据可以用 XML 模式索引,可以从关系数据组合而成,可以分解为关系数据,可以查询和转换,可以独立发布,或者通过混合使用 SQL/XML 和 XQuery 与关系数据组合起来。
Web 浏览器也正在为客户机脚本提供更多的功能来有效地处理 XML。通过使用异步 JavaScript 和 XML(Asynchronous JavaScript and XML,Ajax),Web 页面现在可以直接对应用服务器进行远程过程调用,并且可以在任何返回的 XML 数据上使用 DOM API。
本文将展示如何利用 DB2 XML、Ajax 和 PHP Hypertext Preprocessor (PHP) 提供的功能来编写简单的基于 XML 的应用程序。通过示例场景的帮助,您将学习如何在 JavaScript 中调用 PHP 应用程序;如何使用 DOM 和 SimpleXML API 修改 XML 数据;如何将 XML 从客户机传送到应用程序再到数据库;以及如何创建 PHP Web 服务来使用 SQL/XML 和 XQuery 发布关于 XML 数据的报告。
XML 优点
大多数应用程序都用于创建、存储、操纵和呈现业务数据。对象包装是指将业务数据绑在一起,使业务逻辑更容易处理它们。这些包装器对象的很多功能都是根据关系和格式化规则来提供业务数据的结构,并使业务逻辑能够操纵、发布和串行化封装的数据。
图 1. 基于对象包装器的应用程序
图 1 阐释了使用对象包装器的一个示例人寿保险应用程序。每个方框表示一个对象,每个对象至少有:
·一个构造函数
·Getter 和 Setter 方法
·验证代码
·内部对象层次的串行化
这些对象与实际的业务逻辑没有关系。对象包装是为了使业务逻辑更容易管理业务数据。包装数据所需的代码比业务逻辑要多得多。更多的代码将导致更多的 bug、更大的固定性、更多的维护和更高的成本。
如果对象中的数据变量可以格式化为 XML 结构,并且对象的主要作用是将这些数据暴露给业务逻辑并让业务逻辑操纵它们,那么可以用 DOM 代替对象。
图 2. 基于 XML 的应用程序
图 2 展示了一个使用 XML 和 DOM 包装器的示例保险应用程序。图 1 中的所有数据包装器对象都用一个 DOM 对象代替。业务数据是用 XML 建模的,DOM 提供了必要的 API 来:
·创建新的 XML 对象。
·更新 XML 对象的值。
·导航 XML 对象。
·使用 XPath 在对象层次中搜索。
·串行化和反串行化 XML 对象层次(换句话说,就是内建持久性)。
通过使用 XML,可以避免使用大多数用于管理业务数据的包装器对象。应用程序将变得更加简洁,并且更多地将重点放在业务逻辑上,而不是数据管理上。
XML 和架构
将 XML 引入架构中可以为表示业务数据带来一种标准化的方式。XML 可以提供数据的结构;XML 模式施加结构和格式化规则;DOM API 和 XQuery、XPath 及 XSLT 之类的语言使业务逻辑可以有效地操纵、发布和串行化数据。由于业务数据的 XML 表示在客户机、中间层和数据库中都是一致的,因此操纵这些对象的代码也是类似的。
我将展示如何在三层环境中构建基于 XML 的应用程序,这个三层环境由以下几个部分组成:
·Web 客户机:Asynchronous JavaScript and XML (Ajax),DOM
·应用服务器:PHP 和 SimpleXML
·数据库: DB2 9 和 SQL/XML,XQuery
ACORD 生命データ モデルに基づくシナリオ
このシナリオでは、まず新しい保険契約を表す XML ドキュメントを作成し、次にこのドキュメントをクエリして操作し、このドキュメントをあるレイヤーから別のレイヤーに転送します。別のレベルに移動します。この文書は、生命保険に関する Association for Cooperative Operations Research & Development (ACORD) の XML 仕様に基づいており、健康保険と年金保険で交換する必要があるデータが定義されています。
新しい保険を申し込むには、顧客はいくつかの基本情報を提供する必要があります。情報の一部は PHP アプリケーションに入力され、一部はクライアントのブラウザーに入力されます。その後、ポリシーは DB2 XML 列に保存されます。 DB2 9 では、XML タイプの列は、XML データを解析済みツリーとして内部的にリレーショナル データとは別の場所に保存します。このアプローチは DB2 9 に固有のもので、以前の DB2 バージョンでは XML を格納するためにリレーショナル ストレージ インフラストラクチャが使用されていました。
クライアントとアプリケーション間のポリシー XML ドキュメントの流れは次のとおりです:
・Web クライアントで、顧客はページを更新し、[送信] をクリックします。
・WebクライアントはPHPにXMLHTTPリクエストを送信して、新しい空のポリシー文書を取得します。
・PHP アプリケーションは空のポリシー文書を開き、それをグローバル一意識別子 (GUID) で更新し、その文書を Web クライアントに返します。
・Web クライアントは、Ajax を使用して返されたイベントをキャプチャし、XML DOM を取得し、Web ページに入力された情報をドキュメントに追加します。
・WebクライアントはXMLHTTPを使用して、更新されたXMLをPHPアプリケーションに送信します。
図 3. 新しいポリシー要求 Web サイトを作成します。
図 3 は、新しいポリシー リクエストの作成に使用される Web ページを示しています。ユーザーが「送信」ボタンをクリックすると、JavaScript 関数 submitPolicy() が呼び出されます (リスト 1 を参照)。この関数は、PHP アプリケーション createNewPolicy.php に HTTP リクエストを送信して、空のポリシーを取得します。また、HTTP リクエストから返されたイベントをキャプチャするコールバック関数 fillPolicy() も設定します。
最初のリクエストが中間層 PHP アプリケーション サーバーに到達すると、新しい XML ポリシー ドキュメントが SimpleXML オブジェクトにロードされます。 SimpleXML API を使用して、PHP アプリケーションで作成された GUID で TransRefGUID 要素を更新します。
header('Content-type: text/xml');
$fileContents = file_get_contents("$basedir/acord.xml");
$dom = simplexml_load_string($fileContents);
$dom-> TXLifeRequest->TransRefGUID=$guid;
echo $dom->asXML();
そして、ドキュメントがクライアントに送信されます。
この記事では、GUID が何らかのメカニズム (時間と乱数の組み合わせなど) を通じて作成されることを前提としています。さらに重要なのは、ポリシーを表す XML ドキュメントがビジネス オブジェクトのメモリ内階層としてどのように表示されるか、および SimpleXML API (または DOM/XPath) を使用してこのオブジェクトを移動および更新する方法を理解することです。
基本的な顧客情報を入力します
Web クライアントでは、fillPolicy() 関数が戻り値を読み取ります。返された XML のメモリ内表現を含む DOM オブジェクトを使用して、ポリシー ドキュメントを操作できるようになりました。顧客が Web ページに入力した情報は、DOM を更新するために直接使用されます。ポリシーが顧客情報で更新されると、変更された DOM オブジェクトが XMLHTTP を使用して PHP アプリケーションに送信されます (リスト 2 を参照)。 HTML コンポーネントの値も、DHTMLDocument Object Model (DOM) を使用して読み取られます。