文章詳情頁
使用DB2 9 pureXML管理ODF和Microsoft Office 2007 文檔(1)
瀏覽:4日期:2023-11-08 12:41:59
本文示例源代碼或素材下載 簡介桌面文檔有什么新變化?假如您一直在關注 Microsoft Windows® 社區(qū),那么您會發(fā)現(xiàn)變化實在太大了。 Microsoft 為 MS Office 2007 產(chǎn)品引入了一種新格式,這種格式可以在內(nèi)部利用 XML。 之前,可以在 MS Office 應用程序之間交換數(shù)據(jù);但是,MS Office 2007 和 Windows Vista® 答應企業(yè)踏入數(shù)據(jù)孤島,而在以前,這些數(shù)據(jù)難以使用和再利用(re-purpose,即將用于某一目的的數(shù)據(jù)用于另一個目的)。雖然 Microsoft 正在推動這個概念,但 OpenOffice 應用程序已經(jīng)實現(xiàn)了 ODF,并從市場早已認可的 XML 優(yōu)點中受益。讓我們來看一個典型的桌面應用程序問題。假設有這樣一家公司,它的市場部門正在計劃召開一個會議。 他們要求預期的演講者在一份 MS Word 模板文檔中提交提議,然后,文檔內(nèi)容被用于以下任務:審核提議 向成功提交提議的可能的演講者發(fā)送電子郵件 將相關信息發(fā)布到會議網(wǎng)站上 通過會議或公司的一個新提要(ATOM/RSS)發(fā)布內(nèi)容 按照傳統(tǒng)做法,市場人員從 Word 文檔中剪切文本,并將信息粘貼到不同的系統(tǒng)中,這種做法很費時。 假如保留文檔原有格式,而為特定任務提取相關信息,則可以節(jié)省不少時間和精力。通過 XQuery 就可以做到這一點,而且只需很少的代碼。 在本文中,我們將簡要地回顧 MS Office 應用程序使用的一些舊的文檔數(shù)據(jù)交換方法。然后,我們將查看新的格式,并討論如何交換和再利用這種新格式。我們將使用 Zend Core for IBM、PHP、PDO 和 XQuery 等跨平臺技術 —— 這些工具都可以與 DB2 結合使用。這種技巧可以成為內(nèi)容治理和文檔治理解決方案中很有價值的一部分。希望您閱讀本文之后發(fā)現(xiàn),通過使用 IBM DB2 pureXML™ 特性,使用和再利用 ODF 和 MS Office 2007 文檔不再是難事。這并不需要很多的代碼,所以這個解決方案很輕易實現(xiàn)。然后,您可能希望索引這些 Office 2007 文檔,以進一步利用 pureXML 混合存儲特性。 12345678下一頁 桌面應用程序和 XML 概述本文主要關注 OpenOffice 默認格式 ODF 和 MS Office 2007 格式。您應該清楚,這里談到的概念并不局限于這些格式和供給商。實際上,您會發(fā)現(xiàn),很多供給商都提供了 ODF,包括 Google Applications、KOffice 和 StarOffice。值得注重的是,Microsoft 有一個用于使用和導入 ODF 格式的轉(zhuǎn)換器 “插件,并且有一個兼容包,可以用舊版本的 Office 打開和保存 MS Office 2007 文件格式。而且,Lotus Notes 和 Corel 也有 ODF 格式方面的計劃。Wikipedia 提供了有關 ODF 格式及其在桌面應用程序中的使用的討論,并提供了關于 ODF 的支持者的信息。所需資源雖然可以下載 Apache 2.0、PHP Version 5.21 或更高版本、DB2 Express-C 和 DB2 extensions for PHP,但是下載和安裝 Zend Core for IBM 是更好的選擇。安裝程序會徹底配置適合 PHP 和 DB2 的環(huán)境。安裝程序應該包括 DB2 Express-C 9.1.2 的下載鏈接。可能需要調(diào)整配置,以添加 ZIP 支持,這一點我們在后面會討論到。老式的文檔數(shù)據(jù)交換Windows 操作系統(tǒng)上的數(shù)據(jù)應用程序編程接口(API)從 Data Access Objects (DAO) 開始。它們經(jīng)歷了從 DAO(不是 Dead On Arrival)到 Remote Data Objects (RDO),再到 Open Database Connectivity (ODBC) 的過程。向 ODBC 的轉(zhuǎn)變意義重大,被認為數(shù)據(jù)訪問的一個里程碑。它實現(xiàn)了一種通用的方式,使開發(fā)人員對一種 API 編碼,而不必考慮數(shù)據(jù)庫的類型。通過使用 ODBC,可以借助 Mail Merge 之類的程序?qū)㈥P系數(shù)據(jù)導入到 MS Office 應用程序中。Object Linking and Embedding Data Base (OLE/DB) 支持不同數(shù)據(jù)源的數(shù)據(jù)交換,然而它的引入只是使市場感到困惑。對于 MS Office 生產(chǎn)率工具,這意味著文檔之間可以相互嵌套。實際上,當將一個電子表格粘貼到一個演示文稿中時,就是如此。然而,OLE/DB 是只用于 Windows 的解決方案。使用這些技術分解文檔并不輕易,并且這個過程難以自動化。 上一頁12345678下一頁 OpenOffice 和新的 MS Office 2007 格式概述這些格式實際上是一個包含資源和用于 XML 文檔的文件夾的 ZIP 文件。Word 文檔的實際文本內(nèi)容以 XML 文件的形式存儲。在我們的示例文檔中,它在歸檔文件中的 “word/document.xml 中。這種文件格式使開發(fā)人員可以捕捉這些文檔中的實際數(shù)據(jù)。雖然 OpenOffice 使用這種格式已經(jīng)有一段時間了,但 MS Office 2007 只是最近才引入新的文檔格式。Microsoft 聲稱,這種格式易于訪問和易于共享。很多年來,MS Office 文檔一直都是專用的。令人振奮的是,Microsoft 的 Office 小組正在打開這扇門。請看下面提供的用于 ODF 的 ZIP 文件內(nèi)容(可在 下載 小節(jié)中找到):圖 1. WinZip 中 opendoc.odt 的內(nèi)容
請看下面的 Microsoft 格式,注重其中有些不同,但概念和格式是類似的:圖 1.1 WinZip 中 submit.docx 的內(nèi)容設置數(shù)據(jù)庫當然,您需要創(chuàng)建一個表。您將把新的 Word 格式中的 XML 存儲在 XML 列中,而不是一個 Character Large Object (CLOB) 中。為此,需要創(chuàng)建一個支持 XML 或 UTF-8 的數(shù)據(jù)庫。清單 1. 創(chuàng)建一個支持 XML 的數(shù)據(jù)庫CREATE DATABASE ODF AUTOMATIC STORAGE YES USING CODESET UTF-8 TERRITORY US現(xiàn)在,需要連接到數(shù)據(jù)庫,并用下面的定義創(chuàng)建一個表。下面的代碼假設您有一個具有 CREATETAB 權限的用戶名 “db2admin。假如不具備這種用戶設置,可以修改這些腳本,使具有適當?shù)臄?shù)據(jù)庫用戶。 上一頁12345678下一頁 清單 2. 創(chuàng)建用于包含 ODF 和 MS Office 2007 文檔的支持 XML 的表CREATE TABLE DB2ADMIN.DOCUMENT ( ID INT NOT NULL PRIMARY KEY, OWNER VARCHAR(128), DOC XML )設置 PHP 和 Zend Core for IBM代碼將使用 PHP 的 ZIP 實用程序和 PDO。PDO 已經(jīng)針對 Zend Core for IBM 設置完畢,但是需要將 “zip 添加到配置中:打開 Zend Core Administration Console。 切換到 Configuration 選項卡和 Extensions 子選項卡。 向下滾動到 ZIP 擴展。 單擊 switch 圖標將其打開。 單擊 Save Settings。 重新啟動 Apache2。 假如它不在運行,即在系統(tǒng)托盤中顯示為紅色羽毛,那么啟動 C:Program FilesendApache2inApacheMonitor.exe。 單擊它,從菜單中重新啟動 Apache2 HTTP Server。 假如這樣不行,那么試著編輯文件,確保 “C:Program FilesendCore for IBMetc 文件夾下的 php.ini 文件中包含下面幾行。將下面用粗體表示的一行添加到 php.ini 中:清單 3. 對 php.ini 的修改extension=php_zip.dllextension=php_pdo.dllextension=php_pdo_ibm.dllextension_dir="c:program filesendCore for IBMlibphpext"使用 ODF 和 MS Office 2007 文檔現(xiàn)在,可以開始使用 opendoc.odt 了,它是下載小節(jié)中提供的一個 ODF 文件。雖然 圖 2 顯示了該文檔的 MS Word 外觀,但這個 ODF 文件看起來類似于 清單 4。該文檔使用像 “Heading 1 和 “Heading 2 這樣的樣式作為格式。然后,我們將查詢 Heading 2 樣式,因為 OpenOffice 格式中使用了它。注重,在生產(chǎn)代碼中,還需要包括適當?shù)腻e誤處理代碼。 上一頁12345678下一頁 我還在下載小節(jié)中包括了一個 submit.docx 文檔,該文檔使用 MS Office 2007 格式。圖 2 顯示這個文檔在 Word 中的樣子。和 ODF 一樣,該文檔利用 “Heading 1 和 “Heading 2 之類的 Word 樣式作為格式。然后,我們將查詢 Heading 2 樣式。圖 2. OpenOffice 或 MS Word 中顯示的示例文檔下面的 PHP 代碼使用了這個文檔,它對 ZIP 清單中的項進行遍歷,并提取具有相關數(shù)據(jù)的 XML 文檔。清單 4 提供了該代碼。將該代碼保存為 “odfconsume.php,以便后面引用。清單 4. 使用 OpenOffice (ODF) 格式 (odfconsume.php) 的 PHP 代碼<?php$user = "db2admin";$password = "secret";$zip = zip_open("c:opendoc.odt");$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=ODF;" . "HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;", $user, $password);echo $user." Connected";if ($zip) {while ($zip_entry = zip_read($zip)) {if (zip_entry_open($zip, $zip_entry, "r")&& zip_entry_name($zip_entry) == 'content.xml' ) {$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));$insstr ="INSERT INTO DB2ADMIN.DOCUMENT (ID,OWNER,DOC)VALUES (2,'Linux Office',:buf)";$stmt = $db->prepare( $insstr );$stmt->bindParam( ':buf' , $buf , PDO::PARAM_LOB , strlen($buf) );$stmt->execute();echo "Result: ".$db->errorCode()."";zip_entry_close($zip_entry);}echo "";}zip_close($zip);}?> 上一頁12345678下一頁 使用下面的命令行運行該代碼:php odfconsume.php這會將一個 XML 文檔插入到數(shù)據(jù)庫中,并打印出一個錯誤碼。這里錯誤碼很可能是 0。清單 4.1 是使用 MS Word 的代碼。將該代碼保存為 “msconsume.php,以便后面引用。清單 4.1 使用 MS Office 2007 格式 (msconsume.php) 的 PHP 代碼<?php $user = "db2admin"; $password = "secret"; $zip = zip_open("c:submit.docx"); $db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=ODF;" ."HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;", $user, $password); echo $user." Connected"; if ($zip) { while ($zip_entry = zip_read($zip)) {if (zip_entry_open($zip, $zip_entry, "r") & zip_entry_name($zip_entry) == 'word/document.xml' ) {$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));$insstr ="INSERT INTO DB2ADMIN.DOCUMENT VALUES (1,'BILLY ONAIRE',:buf)";$stmt = $db->prepare( $insstr );$stmt->bindParam( ':buf' , $buf , PDO::PARAM_LOB , strlen($buf) ); $stmt->execute();echo "Result: ".$db->errorCode();zip_entry_close($zip_entry);}echo "";}zip_close($zip); }?> 上一頁12345678下一頁 和前面一樣,用下面的命令行運行該代碼:php msconsume.php這會將一個 XML 文檔插入到數(shù)據(jù)庫中,并打印出一個錯誤碼。同樣,這里錯誤碼很可能是 0。 再利用 ODF 和 Word 2007 內(nèi)容現(xiàn)在,在數(shù)據(jù)庫中有了 OpenOffice 和 Word 2007 文檔的內(nèi)容,您需要再利用該文檔,將它用于網(wǎng)站。這就是我們例子中市場部門必須要做的事情。清單 5 顯示了用于 ODF 的代碼,可以將該代碼保存為 “odfrepurpose.php,以便后面引用。從 輸出(一個 HTML 片段)中,很輕易看到如何將這個文檔重新格式化為一個新聞提要,或者將它并入到一個 Ajax 應用程序中!清單 5. 將 ODF 格式(opendoc.odt)再利用到一個簡單的 HTML 片段中<?php$user = "db2admin";$password = "secret";$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=ODF;" . "HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;", $user, $password);echo $user." Connected";$xqry =<<<TXTvalues( XMLSERIALIZE( XMLQUERY(' declare boundary-space strip; declare namespace text0="urn:oasis:names:tc:opendocument:xmlns:text:1.0"; declare namespace office0="urn:oasis:names:tc:opendocument:xmlns:office:1.0";for $t0 in db2-fn:xmlcolumn("DB2ADMIN.DOCUMENT.DOC")/office0:document-content/office0:body let $p0 := $body0/office0:text/text0:p let $h0 := $body0/office0:text/text0:h where fn:exists($p0) or $h0:h/@text:style-name ="Heading_20_2" return if ( fn:exists( $style ) ) thenif ($h0:h/@text:style-name ="Heading_20_2" ) then <h1>{$txt}</h1>else () else <p>{$txt}</p>') as VARCHAR(2000)))TXT;$result=$db->query( $xqry );$arr = $result->fetch();echo $arr[1];?> 上一頁12345678下一頁 清單 5.1 顯示了再利用 Word 2007 的代碼,可以將該代碼保存為 “msrepurpose.php,以便后面引用。從 輸出(一個 HTML 片段)中,很輕易看到如何將這個文檔重新格式化為一個新聞提要,或者將它并入到一個 Ajax 應用程序中!清單 5.1 將 Word 2007 格式(submit.docx)再利用到一個簡單的 HTML 片段中<?php$user = "db2admin";$password = "secret";$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=ODF;" ."HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;", $user, $password);echo $user." Connected";$xqry =<<<TXTvalues(XMLSERIALIZE( XMLQUERY('declare boundary-space strip;declare namespace text0="urn:oasis:names:tc:opendocument:xmlns:text:1.0";declare namespace office0="urn:oasis:names:tc:opendocument:xmlns:office:1.0";for $t0 in db2-fn:xmlcolumn("DB2ADMIN.DOCUMENT.DOC")/office0:document-content/office0:body/office0:textlet $p := (for $pp in $t0/text0:p return <p>{$pp/text()}</p>)let $h := (for $hh in $t0/text0:h[@text0:style-name="Heading_20_2"]return <hl>{$hh/text()}</hl>)return($h,$p)')as varchar(3000)))TXT;echo "";$result=$db->query( $xqry );$arr = $result->fetch();echo $arr[1];?>要運行該代碼,輸入:php.exe msrepurpose.php現(xiàn)在您也許會問,為什么不直接將它保存為 HTML 呢?XML 的生成會危害原始文檔的完整性,并且會丟失 MS Office 特性。然而,文檔的確小了很多,而且仍然可以用 XQuery 對它進行再利用,就像對待 Word 2007 文件格式一樣。隨著文檔變得越來越大、越來越多(例如在大型會議中),您希望將這個邏輯應用到儲存庫中每個文檔的每個部分。于是 XQuery 的威力就表現(xiàn)出來了!和 SQL 一樣,XQuery 使您通過一個查詢處理一組文檔。實際上,假如您愿意,也可以使用 SQL 查詢得到同樣的結果,因為在 DB2 中這兩種語言可以互換。下面的清單顯示了 odfrepurpose.php 或 msrepurpose.php 的結果:清單 6. 輸出db2admin Connected<h1>Introduction to Web 2.0</h1><p>This is a documentthat will impress upon ...</p><h1>Abstract</h1><p>The nature of the industry is again turning to the browser ...</p>結束語本文討論的技巧在內(nèi)容治理和文檔治理解決方案中很有用。希望您已經(jīng)發(fā)現(xiàn),通過 IBM DB2 pureXML 特性使用和再利用 OpenOffice 和 MS Office 2007 文檔十分輕易。實際上這個過程不需要很多代碼,這一點有助于取得好的性能。之后,考慮索引這些 XML 文檔,以進一步利用 pureXML 混合存儲特性的優(yōu)點。 上一頁12345678

標簽:
DB2
數(shù)據(jù)庫
排行榜
