CREATE DATABASE ODF AUTOMATIC STORAGE YES USING CODESET UTF-8 TERRITORY US
现在,需要连接到数据库,并用下面的定义创建一个表。下面的代码假设您有一个具有 CREATETAB 权限的用户名 “db2admin”。假如不具备这种用户设置,可以修改这些脚本,使具有适当的数据库用户。 上一页12345678下一页 清单 2. 创建用于包含 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 已经针对 Zend Core for IBM 设置完毕,但是需要将 “zip” 添加到配置中: 打开 Zend Core Administration Console。 切换到 Configuration 选项卡和 Extensions 子选项卡。 向下滚动到 ZIP 扩展。 单击 switch 图标将其打开。 单击 Save Settings。 重新启动 Apache2。 假如它不在运行,即在系统托盘中显示为红色羽毛,那么启动 C:Program FilesendApache2inApacheMonitor.exe。 单击它,从菜单中重新启动 Apache2 HTTP Server。 假如这样不行,那么试着编辑文件,确保 “C:Program FilesendCore for IBMetc” 文件夹下的 php.ini 文件中包含下面几行。将下面用粗体表示的一行添加到 php.ini 中: 清单 3. 对 php.ini 的修改extension=php_zip.dll
extension=php_pdo.dll
extension=php_pdo_ibm.dll
extension_dir="c:program filesendCore for IBMlibphpext"
使用 ODF 和 MS Office 2007 文档 现在,可以开始使用 opendoc.odt 了,它是下载小节中提供的一个 ODF 文件。虽然 图 2 显示了该文档的 MS Word 外观,但这个 ODF 文件看起来类似于 清单 4。该文档使用像 “Heading 1” 和 “Heading 2” 这样的样式作为格式。然后,我们将查询 Heading 2 样式,因为 OpenOffice 格式中使用了它。注重,在生产代码中,还需要包括适当的错误处理代码。 上一页12345678下一页 我还在下载小节中包括了一个 submit.docx 文档,该文档使用 MS Office 2007 格式。图 2 显示这个文档在 Word 中的样子。和 ODF 一样,该文档利用 “Heading 1” 和 “Heading 2” 之类的 Word 样式作为格式。然后,我们将查询 Heading 2 样式。 图 2. OpenOffice 或 MS Word 中显示的示例文档 下面的 PHP 代码使用了这个文档,它对 ZIP 清单中的项进行遍历,并提取具有相关数据的 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 文档插入到数据库中,并打印出一个错误码。这里错误码很可能是 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 文档插入到数据库中,并打印出一个错误码。同样,这里错误码很可能是 0。 再利用 ODF 和 Word 2007 内容 现在,在数据库中有了 OpenOffice 和 Word 2007 文档的内容,您需要再利用该文档,将它用于网站。这就是我们例子中市场部门必须要做的事情。清单 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 =
<<<TXT
values(
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 ) ) then
if ($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 =
<<<TXT
values(
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:text
let $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
现在您也许会问,为什么不直接将它保存为 HTML 呢?XML 的生成会危害原始文档的完整性,并且会丢失 MS Office 特性。然而,文档的确小了很多,而且仍然可以用 XQuery 对它进行再利用,就像对待 Word 2007 文件格式一样。随着文档变得越来越大、越来越多(例如在大型会议中),您希望将这个逻辑应用到储存库中每个文档的每个部分。于是 XQuery 的威力就表现出来了!和 SQL 一样,XQuery 使您通过一个查询处理一组文档。实际上,假如您愿意,也可以使用 SQL 查询得到同样的结果,因为在 DB2 中这两种语言可以互换。 下面的清单显示了 odfrepurpose.php 或 msrepurpose.php 的结果: 清单 6. 输出db2admin Connected
<h1>Introduction to Web 2.0</h1><p>This is a document
that will impress upon ...</p><h1>Abstract</h1><p>The nature of the industry is a
gain turning to the browser ...</p>
结束语 本文讨论的技巧在内容治理和文档治理解决方案中很有用。希望您已经发现,通过 IBM DB2 pureXML 特性使用和再利用 OpenOffice 和 MS Office 2007 文档十分轻易。实际上这个过程不需要很多代码,这一点有助于取得好的性能。之后,考虑索引这些 XML 文档,以进一步利用 pureXML 混合存储特性的优点。 上一页12345678 新闻热点
疑难解答