當前位置:編程學習大全網 - 編程語言 - 使用PHP和AJAX的XML編程

使用PHP和AJAX的XML編程

在 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 優點

大多數應用程序都用於創建、存儲、操縱和呈現業務數據。對象包裝是指將業務數據綁在壹起,使業務邏輯更容易處理它們。這些包裝器對象的很多功能都是根據關系和格式化規則來提供業務數據的結構,並使業務邏輯能夠操縱、發布和串行化封裝的數據。

·壹個構造函數

·Getter 和 Setter 方法

·驗證代碼

·內部對象層次的串行化

這些對象與實際的業務邏輯沒有關系。對象包裝是為了使業務邏輯更容易管理業務數據。包裝數據所需的代碼比業務邏輯要多得多。更多的代碼將導致更多的 bug、更大的固定性、更多的維護和更高的成本。

如果對象中的數據變量可以格式化為 XML 結構,並且對象的主要作用是將這些數據暴露給業務邏輯並讓業務邏輯操縱它們,那麽可以用 DOM 代替對象。

·創建新的 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 客戶機中,客戶更新頁面並單擊 Submit。

·Web 客戶機向 PHP 發出壹個 XMLHTTP 請求,以獲得新的空白保單文檔。

·PHP 應用程序打開壹個空白的保單文檔,用壹個全局惟壹標識符(GUID)更新它,然後將該文檔返回給 Web 客戶機。

·Web 客戶機使用 Ajax 捕捉返回的事件,並檢索 XML DOM,然後用 Web 頁面中輸入的信息填充該文檔。

·Web 客戶機使用 XMLHTTP 將更新後的 XML 發送給 PHP 應用程序。

當第壹個請求到達中間層的 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。當使用客戶信息更新了保單之後,使用 XMLHTTP 將修改後的 DOM 對象提交回 PHP 應用程序(見清單 2)。即使是 HTML 組件值也是用 DHTMLDocument Object Model (DOM) 讀取的。

#p#副標題#e#

將保單存儲在 DB2 中

PHP 應用程序將傳入的 XML 文檔直接存儲在數據庫中,而不需要解析它(見清單 3)。DB2 的 pureXML 支持將隱式地解析傳入的 XML,並將其存儲在壹個類 DOM 的分層結構中。現在,可以在 XQuery 語句中使用 XPath 之類的 XML 導航技術(就像在 DOM 中使用的那樣)來查詢 XML。DB2 9 還提供了在該層次結構中的任何節點上索引的能力。

公開 XML 文檔上的服務

新的保單存儲在 DB2 9 中以後,保險代理可以查詢該保單,以決定是否接受這個保險。用於獲得關於新保單報告的查詢通過 Web 服務公開給客戶機應用程序。

這個例子中的 Web 服務是用 PHP 編寫的,它為調用實現服務的業務和轉換邏輯的 DB2 存儲過程提供了壹個簡潔的接口。每個 DB2 存儲過程由壹個 SQL/XML 查詢組成,它過濾和轉換存儲在數據庫中的 XML 保單,以創建壹個輸出 XML 文檔。然後,該 PHP Web 服務將 XML 文檔返回給客戶機。

我們來分析每個存儲過程,看看那些有效地組成 Web 服務實現的查詢。

列出所有新客戶保險的 DB2 查詢。包含該查詢的存儲過程是listAllNewCustomers(見清單 4)。該查詢搜索 ACORD 表的 INFO 列中的所有保單文檔。在每個 XML 文檔中,DB2 進壹步向下分析,以便只返回 PolicyStatus/@tc 屬性的代碼值被設為 12(也就是建議的值)的那些文檔。查詢輸出是壹個 XML 文檔,它有壹個根節點 newpolicylist,該節點包含壹系列的用於每個新保單的 TXLife 子節點(見圖 4)。

註意這個查詢第壹次如何使用 DB2 XQuery 函數 db2-fn:xmlcolumn 來導航關系模式,以定位到 XML 列 。當它到達 XML 列時,它進壹步使用 XPath 在 XML 模式中導航到適當的節點(類似於使用 PHP、JavaScript 或其他語言導航 DOM)。

列出有風險客戶的提議保險的 DB2 查詢。該查詢只列出有風險的新客戶(也就是說,他們對於某個醫療問題的回答是 yes)。該查詢包含在壹個名為 listAtRiskNewCustomers 的存儲過程中(見清單 5)。 註意:WHERE 子句同時檢查答案和保單狀態。

評估有風險新客戶的風險度的 DB2 查詢。對於以上列表中的每個保單,在保單的健康風險區域只能列出回答為 yes 的問題。該查詢還返回 policytype,以顯示該保單值多少錢,以便評估風險。包含該查詢的存儲過程(見清單 6)是 getRiskQuestions(guid)。 註意:您需要壹個支持 XML 類型的 DB2 驅動程序版本。否則,在每個存儲過程中都需要使用 XMLSerialize 來從 XMLQuery 中串行化 XML 值。請參閱 developerWorks 文章 “結合使用 DB2 原生 XML 與 PHP” 以獲得更詳細的信息。

創建 Web 服務

用於 getnewpolicyinfo Web 服務的 PHP 代碼是壹個瘦包裝器,它檢查所需保單報告的類型,並調用適當的存儲過程。然後,將存儲過程所返回的值發送回客戶機(見清單 7)。註意用 PHP 創建 Web 服務是多麽簡單。最後三行將該功能公開為壹個 Web 服務。在任何客戶機中,包括在 PHP 應用程序中,都可以調用 Web 服務,如清單 8 所示。

結束語

在過去幾年中,各應用程序層的 XML 支持都已成熟,這導致壹種強大的開發環境的出現,這種開發環境可以改變企業應用的設計方式。XML 使開發人員可以為業務文檔定義規則和結構,還可以在內存中將文檔實例化為分層對象,開發人員可以在任何層使用標準 API 對這種對象進行導航、修改和串行化。Ajax 使基於 Web 的客戶機腳本可以調用 DOM API,還可以對中間層進行遠程過程調用。PHP 為處理 XML 和 Web 服務提供了最簡單的方法之壹,因此非常適合基於 XML 的應用程序開發。XML 演變的最後壹鏈是數據庫層。DB2 9 使數據庫層能操縱 XML。因此這個演變周期宣告結束。

#p#副標題#e#

  • 上一篇:貴州省貴陽市烏當區屬於哪個省
  • 下一篇:請問,機電壹體化專業的就業前景如何及工資待遇?
  • copyright 2024編程學習大全網