IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  XML | Information Management  >

在全球化的环境中集成 XML 数据

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

杨志平, 软件工程师, IBM

2009 年 9 月 24 日

伴随着经济的全球化,信息整合变得越来越重要,其中一个很重要的方面就是如何在一个国际化的环境中,对各种不同语言的信息进行整合。本文主要是以一个电影票房为实例,介绍了在国际化的分布式环境中,如何利用 InfoSphere Federation Server V9.7 集成各种不同语言的 XML 数据。

在全球化的环境中集成XML数据

伴随着经济的全球化,信息整合变得越来越重要,其中一个很重要的方面就是如何在一个国际化的环境中,对各种不同语言的信息进行整合。本文主要是以一个电影票房为实例,介绍了在国际化的分布式环境中,如何利用 InfoSphere Federation Server V9.7 集成各种不同语言的 XML 数据。

概述

PureXML 作为 DB2 的最大亮点,在 DB2 V9 的时候只支持在 UNICODE 的数据库中存储 XML 列,从 V95 开始,DB2 支持在非 UNICODE 的数据库中存储 XML 数据。基于 DB2 的这一特性,联邦数据库系统 Federation Server V95 能够对远程的 UNICODE 和非 UNICODE 的数据库上的 XML 数据进行集成。作者将主要通过一个电影票房的演示范例,阐述如何在全球化的多语言的环境下,对 XML 数据进行集成。





回页首


Federation Server 中集成 XML 数据的两种主要方法

目前利用 Federation Server 对 XML 数据进行集成主要有两种方法,一种是通过 XML wrapper,另一种是通过 DRDA wrapper 。

第一种方式,利用 XML wrapper 进行 XML 数据集成,本质上是将 XML 文档映射成为关系型的数据表的形式,所以它不支持 SQL\XML 函数和 XQUERY 的,无法进行关系型和非关系型的数据的混合查询。下面是一个在 AIX 系统上的简单的例子,假设有一个 XML 文档 foo.xml,其内容如下:

<?xml version="1.0"?> 
 <doc>
  <title> employees </title> 
  <name first="David" last="Marston"/> 
  <name first="David" last="Bertoni"/> 
  <name first="Donald" last="Leslie"/> 
  <name first="Emily" last="Farmer"/> 
 </doc>

首先创建 XML WRAPPER,

CREATE WRAPPER xml_wrapper LIBRARY 'libdb2lsxml.a' options (DB2_FENCED 'N');

然后创建对应的 SERVER,

CREATE SERVER xml_server WRAPPER xml_wrapper;

最后通过指定 XML 的文件路径和 XPATH 创建相应的 NICKNAME,

CREATE NICKNAME xml_nick (fname varchar(16) options(xpath '@first'), 
lname varchar(16) options(xpath '@last')) FOR SERVER xml_server 
OPTIONS(file_path './foo.xml', XPATH '//name')


从该语句我们可以看出,建立了 NICKNAME 以后,就相当于与 XML 文档的节点 first 和 last 建立了一种关系型映射关系,查询的结果如下。

select * from xml_nick 
 FNAME   LNAME
 ------- --------- 
 David   Marston 
 David   Bertoni 
 Donald  Leslie 
 Emily   Farmer 

10 record(s) selected.

第二种方式,利用 DRDA wrapper,是基于 PURE XML 的,只能在 Federation Server V95 及其以后的版本上实现。由于 XML 是作为一种全新的数据类型以 XML 列的形式出现的,因此可以充分利用 DB2 PURE XML 的一些特性,可以支持 XQUERY 和 SQL\XML 函数,可以进行关系型和非关系型数据的混合查询。在对 XML 数据进行集成的时候与第一种方式有以下几个显著不同的地方:

1. 我们可以创建一张表,直接将上述的 XML 文件以 XML 列的形式存储在远程的 UDB 数据源中,然后插入 XML 数据,例如,

CREATE TABLE rtable1 ("docid" INT , "xmlcol" XML ) 
 INSERT INTO rtable1 (docid,xmlcol) VALUES(1000,'
 <?xml version="1.0"?>
 <doc><title> employees </title> 
	 <name first="David" last="Marston"/>
	 <name first="David" last="Bertoni"/>
	 <name first="Donald" last="Leslie"/>
	 <name first="Emily" last="Farmer"/>
 </doc>')
 
 

2. 我们创建的是 DRDA WRAPPER 而不是 XML WRAPPER,如下,

CREATE WRAPPER "drda_wrap" LIBRARY 'libdb2drda.a' OPTIONS(DB2_FENCED 'Y');

3. 我们创建的 NICKNAME 是直接和远程 UDB 数据源上的整个表相对应的,而不需要针对每个 XML 文档中的每个节点建立一个列。

CREATE NICKNAME "drda_nick" FOR "server1"."user1"." rtable1";

建立了 NICKNAME 以后,我们就可以利用 PURE XML 的特性,基于 NICKNAME 进行关系型和非关系型数据的混合查询,在下文中,我们将主要介绍第二种方式。





回页首


XML 数据集成中的代码页转换问题

在通常的英语环境中,利用 Federation Server 进行 XML 数据的集成,基本上可以参阅上述的两种方法,不存在各种代码页转换方面的问题,详细的情况,读者可以参阅文献 1,在此不再累赘。

但是,在一个全球化的多语言环境中,XML 数据可能是各种语言的,数据库和客户端的代码页也可能各不相同,在这种情况下,对 XML 数据进行集成的时候,就必须要充分考虑代码页转换的问题了。在 DB2 中,XML 都是以树状的文档对象模型(DOM)的形式存储的,文本节点是以 UTF-8 编码的形式存储的。当客户端的代码页和数据库的代码页不一致的时候,必须进行代码页的转换,将 XML 文档从客户端的代码页转换成数据库的代码页。例如如果客户端是中文 GBK 的,数据库是 UNICODE,则 DB2 会将 XML 从 GBK 转换为 UNICODE 格式;如果客户端和数据库都是 UNICODE,则不进行代码页转换。

联邦数据库系统在代码页转换方面,保持和 DB2 一样的规则。也就是说,当客户端的代码页和 Federated Server 的代码页不一致的时候,XML 中的文本节点将从客户端的代码页转换成 Federated Server 的代码页。

下面我们将以一个电影票房场景为例,详细的介绍如何在全球化的多语言环境中,利用 Federation Server V95 集成 XML 数据。





回页首


电影票房分析

文中的电影票房演示系统主要具有以下三个特点,第一,分布式环境,远程数据库部署在不同类型的操作系统上;第二,远程 DB2 数据源的代码页各不相同;第三,XML 文档具有不同的字符编码。

首先,在不同操作系统的机器上创建 DB2 数据库,将其作为 Federated Server 的远程数据源;然后在这些数据库上分别创建一张包括 XML 列的表,用 XML 列来存储所有关于电影的信息,包括电影名称,在某城市的票房收入,观众对电影的评论等等;接着我们在远程 DB2 数据源上插入各种不同字符编码的 XML 数据;最后,我们将演示如何通过 Federation Servers 对 XML 数据进行信息集成,利用 SQL/XML 函数和 XQuery,进行关系型数据和非关系型的 XML 数据的混合查询,包括查询电影的票房收入,观众对电影的评价,即使这些评论可能是用不同的语言写的。

搭建分布式的数据库环境来存储 XML 数据

在分布式的环境上创建各种数据库

我们假设该系统分布在多个国家的五个不同类别的操作系统上,在这些不同的操作系统上,我们分别创建了五种不同语言的 DB2 的数据库,包括英文,中文,日文,希腊文和俄文,这些数据库用来存储电影在该国的各个城市的票房信息和观众的各种评论,如下图所示。


表 1. 创建多种语言的数据库
数据库字符集操作系统机器名建库的语句目的
1EnglishAix 64machine1create database RDBEN ALIAS DBEN using codeset ISO8859-1 territory US存储电影在美国的票房和观众评论
2ChineseNT 32machine2create database RDBGBK ALIAS DBGBK using codeset GBK territory CN存储电影在中国的票房和观众评论
3JapaneseSolaris 64machine3create database RDBJP ALIAS DBJP using codeset EUC-JP territory JP存储电影在日本的票房和观众评论
4GreekLinuxAMD64machine4create database RDBGR ALIAS DBGR using codeset ISO-8859-7 territory GR存储电影在希腊的票房和观众评论
5RussianLinuxIA32machine5create database RDBRUS ALIAS DBRUS using codeset ISO8859-5 territory RU存储电影在俄国的票房和观众评论

创建包含 XML 列的数据库表

在每一个数据库上都创建一张相同结构的表,包括两个数据列,一个是电影唯一标识号,另一个是存储电影各种信息的 XML 列。

CREATE TABLE "S1_TAB1" ("FILMCODE" INT , "XMLCOL" XML )

其中 XML 文档的结构如下,

<movie> 
	 <countrycode> 
	 … 
	 </countrycode>
	 <name>
	 ......
	 </name> 
	 <remark>
	  …… 
	 </remark> 
	 <remark>
	  …… 
	 </remark> 
	 <city_boxoffice> 
		 <city_name> 
		 … 
		 </city_name> 
		 <boxoffice> 
		 … 
		 </boxoffice> 
	 </city_boxoffice> 
	 <city_boxoffice> 
		 <city_name> 
		 … 
		 </city_name> 
		 <boxoffice> 
		 … 
		 </boxoffice> 
	 </city_boxoffice> 
 </movie>

插入各种语言编码的 XML 数据

我们将在这五种不同的语言的数据库中,分别插入数据。为了保证客户端的编码和数据库的代码页一致,在插入数据之前,我们使操作系统的 LOCALE 与 XML 的编码一致,比如插入希腊文的 XML 的时候,执行 :

export LANG=greek

而在插入俄文的时候,执行 :

export LANG=ru_RU.iso88595

1. 在英文数据库中插入 XML 数据

INSERT INTO TABLE_EN1(FILMCODE,XMLCOL) VALUES(1000, 
 '<movie> 
	 <countrycode>1</countrycode> 
	 <name>Crouching Tiger Hidden Dragon</name> 
	 <remark>I love Yun-Fat Chow</remark> 
	 <remark>Chinese Kung Fu is really cool</remark> 
	 <city_boxoffice> 
		 <city_name>New York</city_name> 
		 <boxoffice>3000</boxoffice>
	</city_boxoffice> 
	<city_boxoffice> 
		 <city_name>California</city_name> 
		 <boxoffice>1600</boxoffice>
	 </city_boxoffice> 
 </movie>'); 
 INSERT INTO TABLE _EN1(FILMCODE,XMLCOL) VALUES(1001, 
 '<movie> 
	 <countrycode>1</countrycode> 
	 <name>True lies</name> 
	 <remark>Schwarzenegger is too cool</remark> 
	 <remark>Recommend you see this film</remark> 
	 <city_boxoffice>
		 <city_name>Washington</city_name> 
		 <boxoffice>700</boxoffice>
	 </city_boxoffice> 
	 <city_boxoffice> 
		 <city_name>Hawaii</city_name> 
		 <boxoffice>1300</boxoffice>
	 </city_boxoffice> 
 </movie>'); 
 INSERT INTO TABLE _EN1(FILMCODE,XMLCOL) VALUES(1002, 
 '<movie> 
	 <countrycode>1</countrycode> 
	 <name>Charlies Angels</name> 
	 <remark>too many sexy beauty</remark>
	 <remark>i think all man love this film</remark> 
	 <city_boxoffice> 
		 <city_name>New York</city_name> 
		 <boxoffice>700</boxoffice>
	 </city_boxoffice> 
	 <city_boxoffice> 
		 <city_name>Hawaii</city_name>
		 <boxoffice>1300</boxoffice>
	 </city_boxoffice> 
 </movie>');

2. 在中文数据中插入 XML 数据

INSERT INTO TABLE _GBK1(FILMCODE,XMLCOL) VALUES(1000, 
 '<movie> 
	<countrycode>86</countrycode> 
	<name> 卧虎藏龙 </name>
	<remark> 我最爱发哥 </remark> 
	<remark> 中国功夫真厉害 </remark> 
	<city_boxoffice> 
		<city_name>Beijing</city_name> 
		<boxoffice>1000</boxoffice>
	</city_boxoffice>
	<city_boxoffice> 
		<city_name>Shanghai</city_name> 
		<boxoffice>1500</boxoffice>
	</city_boxoffice> 
 </movie>'); 
 INSERT INTO TABLE _GBK1(FILMCODE,XMLCOL) VALUES(1001, 
 '<movie> 
	<countrycode>86</countrycode>
	<name> 真实谎言 </name> 
	<remark> 施瓦辛格好酷啊 </remark> 
	<remark> 超级火爆,值得一看 </remark> 
	<city_boxoffice>
		<city_name>Beijing</city_name>
		<boxoffice>1200</boxoffice>
	</city_boxoffice> 
	<city_boxoffice> 
		<city_name>Guangzhou</city_name>
		<boxoffice>700</boxoffice>
	</city_boxoffice> 
 </movie>');

3. 在日文数据库中插入 XML 数据

INSERT INTO TABLE _JP1(FILMCODE,XMLCOL) VALUES(1000, 
 '<movie> 
	<countrycode>81</countrycode> 
	<name> しゃがんで隠れたドラゴンタイガー </name> 
	<remark> 中国語を勉強したくてカンフーハッスル </remark> 
	<remark> 非常に素晴らしい </remark> 
	<city_boxoffice>
		<city_name> 東京 </city_name>
		<boxoffice>1300</boxoffice>
	</city_boxoffice> 
	<city_boxoffice> 
		<city_name> 北海道 </city_name>
		<boxoffice>900</boxoffice>
	</city_boxoffice> 
 </movie>'); 
 INSERT INTO TABLE _JP1(FILMCODE,XMLCOL) VALUES(1001, 
 '<movie>
	<countrycode>81</countrycode>
	<name> トゥルーライズ </name> 
	<remark> シュワルツェネッガーはあまりにもクール </remark> 
	<remark> を強くお勧めします。この映画を見て </remark> 
	<city_boxoffice> 
		<city_name> 東京 </city_name> 
		<boxoffice>1100</boxoffice>
	</city_boxoffice> 
	<city_boxoffice>
		<city_name> 北海道 </city_name> 
		<boxoffice>300</boxoffice>
	</city_boxoffice> 
 </movie>');

4. 在希腊文数据库中插入 XML 数据

INSERT INTO TABLE _GR1(FILMCODE,XMLCOL) VALUES(1002, 
 '<movie>
	<countrycode>30</countrycode>
	<name> Αγγελοι του Charlie</name>
	<remark> Μου αρεσει αυτη η ταινια </remark> 
	<remark> πολυ θαυμασιο </remark>
	<city_boxoffice> 
		<city_name> Αθηνα </city_name> 
		<boxoffice>1600</boxoffice>
	</city_boxoffice> 
 </movie>');

5. 在俄文数据库中插入 XML 数据

INSERT INTO TABLE _RUS1(FILMCODE,XMLCOL) VALUES(1001, 
 '<movie> 
	 <countrycode>7</countrycode> 
	 <name> Правда заключается </name> 
	 <remark> Я люблю этот фильм </remark> 
	 <city_boxoffice> 
		 <city_name> Москва </city_name> 
		 <boxoffice>700</boxoffice>
	 </city_boxoffice> 
 </movie>');

搭建联邦数据库系统

在这一节,我们将演示如何创建一个 Federated Server,然后利用该 Server 来访问位于分布式数据库系统上的各种语言的 XML 数据,在这里,我们以英文库 RDBEN 为例,其他的类似。

1. 编目远程节点,主要是将远程的 DB2 机器名称和服务端口号映射到本地,命令如下,

CATALOG TCPIP NODE FDBNODE1 REMOTE1 MACHINE1 SERVER 50001;

2. 编目远程数据库,主要是将远程的数据库映射到本地。

CATALOG DATABASE RDBEN AS DBEN AT NODE FDBNODE1;

3. 配置 DBM 参数,使 DB2 Instance 支持联邦数据库

UPDATE DBM CFG USING FEDERATED YES

4. 创建 UNICODE 的 Federation Server,实际上也就是在一个支持联邦数据库的 DB2 Instance 上创建一个 DB2 的数据库。

CREATE DB FEDDB USING CODESET UTF-8 TERRITORY CN AUTHENTICATION CLIENT;

5. 创建 WRAPPER 。

CREATE WRAPPER "FEDWRAP" LIBRARY 'libdb2drda.so' OPTIONS(DB2_FENCED 'Y');

6. 创建 SERVER 。

CREATE SERVER "SEREN" TYPE DB2/CS VERSION 95 WRAPPER "FEDWRAP" 
AUTHORIZATION "user1" password "password" 
OPTIONS(DB2_XML_ENABLE 'Y', node 'FDBNODE1', DBNAME 'RDBEN', PASSWORD 'Y', PUSHDOWN 'Y');

7. 创建用户映射关系。

CREATE USER MAPPING FOR USER SERVER “ SEREN ” 
OPTIONS (REMOTE_AUTHID ‘ user1 ’ , REMOTE_PASSWORD ‘ password ’ );

8. 创建昵称

CREATE NICKNAME NICK_EN FOR “ SEREN ” . ” user1 ” .TABLE_EN1

利用 Federation Server 对远程 XML 数据进行集成

首先我们创建一个 VIEW,将所有昵称上的信息整合到一起,如下,

CREATE VIEW UNIONALL AS SELECT * FROM NICK_EN1 
 UNION ALL 
 SELECT * FROM NICK_GBK1 
 UNION ALL 
 SELECT * FROM NICK_JP1 
 UNION ALL 
 SELECT * FROM NICK_GR1 
 UNION ALL 
 SELECT * FROM NICK_RUS1;
 

在后面的各种查询都基于这个综合了所有信息的 VIEW,这样使得查询更加简洁。

用 SQL 和 SQL/XML 函数进行混合关系型数和非关系型数据的混合查询

情形一:查询电影代码和电影名称之间的关系

因为同一部电影在不同的国家有不同的翻译,也就有各不相同的名称,我们以电影的识别号 FILMCODE 来唯一标识电影,利用 XMLTABLE 函数做查询,得到了电影名和 FILMCODE 的对应关系。

select p.filmcode,xmltable.filename 
 from unionall p, XMLTABLE('$xmlcol/movie' PASSING p.XMLCOL AS "xmlcol" 
 columns filename char(50) path 'name') AS xmltable 
 order by p.filmcode 
 FILMCODE FILENAME 
 ----------- -------------- 
 1000 しゃがんで隠れたドラゴンタイガー 
 1000 卧虎藏龙 
 1000 Crouching Tiger Hidden Dragon 
 1001 トゥルーライズ 
 1001 真实谎言 
 1001 True lies 
 1001 Правда заключается 
 1002 Αγγελοι του Charlie 
 1002 Charlies Angels 
 
 9 record(s) selected.

从上面的查询结果中我们可以发现,查询结果中包含有中文,日文,英文,俄语和希腊语等五个国家的语言,这几种语言我们都正确的显示了,没有任何的乱码。

情形二:查询电影“霹雳娇娃”在希腊雅典的票房收入

电影“霹雳娇娃”的唯一标识号是 1002,希腊的国家代码 countrycode 是 30,我们除了利用 XMLTABLE 函数外,还利用了 XMLEXISTS 函数将查询结果限制在希腊。

select name,city,profit 
 from unionall p, XMLTABLE('$xmlcol/movie/city_boxoffice' PASSING p.XMLCOL AS "xmlcol" 
 columns name char(50) path '../name',profit int path 'boxoffice',
 city char(50) path 'city_name') AS TABLE1 
 where p.FILMCODE=1002 
 and XMLEXISTS('$q/movie/countrycode[text() = "30"]' passing p.XMLCOL as "q") 
 and table1.city = ' Αθηνα '

从下面的查询结果中,我们知道了该电影在雅典的票房收入为 1600 万。

NAME CITY PROFIT 
 ----------- ----------------------------- 
Αγγελοι του Charlie Αθηνα 1600 

1 record(s) selected.

情形三:查询电影“真实谎言”在全球的票房收入

在这个查询中,我们演示了如何在 XMLTABLE 函数中嵌套了使用 SQLQUERY 函数,来进行 SQL 和 XML 的混合查询,同时演示了如何利用 sum 函数来对 XML 文档中的指定节点进行数值统计。

select sum(profit) as boxoffice 
 from XMLTABLE('db2-fn:sqlquery("select XMLCOL from unionall 
 where FILMCODE = 1001")/movie/city_boxoffice' columns city char(20) path 'city_name', 
 profit int path 'boxoffice') AS TABLE1
 
 

得到查询结果显示电影“真实谎言”在全球的票房收入为 6000 万。

BOXOFFICE 
----------- 
6000 

1 record(s) selected.

情形四:美国的电影票房排行榜

利用表函数 XMLTABLE 将 XML 数据关系化,然后以美国的国家代码 countrycode 等于 1 为条件,按照电影唯一标识号 FILECODE 进行分组,以票房收入 profit 的总和进行降序排列。

select p.FILMCODE, sum(profit) as boxoffice 
 from unionall p, XMLTABLE('$movie//city_boxoffice' PASSING p.XMLCOL AS "movie" 
 columns profit int path 'boxoffice', countrycode int path '../countrycode') AS TABLE1 
 where table1.countrycode=1 
 group by p.FILMCODE 
 order by sum(profit) desc

得到查询结果如下图所示,由 FILMCODE 和电影名称的对应关系,我们不难发现,在美国电影票房市场,“卧虎藏龙”排名第一 4600 万,电影“真实谎言”和“霹雳娇娃”,票房都是 2000 万。

FILMCODE BOXOFFICE 
----------- ----------- 
1000 4600 
1001 2000 
1002 2000 

3 record(s) selected.

情形五:全球票房排行榜

对 XML 中的节点 boxoffice 进行按照电影唯一标识号 FILMCODE 进行分类统计排名,并按照票房收入的降序排列。

select p.FILMCODE, sum(profit) as boxoffice 
 from unionall p, XMLTABLE('$movie//city_boxoffice' PASSING p.XMLCOL AS "movie" 
 columns profit int path 'boxoffice') AS TABLE1 
 group by p.FILMCODE 
 order by sum(profit) desc
 

得到查询结果如下。在全球票房排行榜上,电影“卧虎藏龙”排名第一共 9300 万,其次是“真实谎言” 6000 万,排名第三的是“霹雳娇娃”,票房 3600 万。

FILMCODE BOXOFFICE 
----------- ----------- 
1000 9300 
1001 6000 
1002 3600 

3 record(s) selected.

利用 XQuery 查询 XML 数据

情形六:日本观众对电影“真实谎言”的评论

首先利用 SQL 语句查询出 FILMCODE=1001 的行,然后在该行对应的 XML 列中,以 countrycode=81 为条件,利用 XQUERY 查询出 REMARK 节点,查询语句和结果如下所示。

xquery for $movie in db2-fn:sqlquery("select XMLCOL from unionall p 
where FILMCODE=1001")/movie let $remark := $movie/remark,$name := $movie/name 
where $movie/countrycode='81' return $remark 
 1 
 ---------------- 
 <remark> シュワルツェネッガーはあまりにもクール </remark> 
 <remark> を強くお勧めします。この映画を見て </remark> 
 
 2 record(s) selected.

情形七:全球观众对电影“卧虎藏龙”的评论

该查询与上面的情形六类似,只不过我们不需要在 XML 查询中限制 countrycode 为某一个特定的值,这样查询出来的结果就是全球观众对电影的评论了,如下所示。

XQUERY db2-fn:sqlquery("select XMLCOL from unionall p where FILMCODE=1000")/movie/remark 
 1 
 ------------------- 
 <remark> 中国語を勉強したくてカンフーハッスル </remark> 
 <remark> 非常に素晴らしい </remark> 
 <remark> 我最爱发哥 </remark> 
 <remark> 中国功夫真厉害 </remark> 
 <remark>I love Yun-Fat Chow</remark> 
 <remark>Chinese Kung Fu is really cool</remark> 
 
 6 record(s) selected.

从返回的查询结果我们可以看出,里面同时包含有中文,日文,英文等三种不同的语言。





回页首


总结

本文通过对一个电影票房的实例分析,阐述了如何利用 Federated Server V95 在全球化的多语言环境下集成 XML 信息,在当前 XML 使用越来越广泛的背景下,希望对从事相关工作的读者能有一定的帮助。



参考资料

学习

获得产品和技术

讨论


关于作者

杨志平是 IBM 中国软件开发中心的一名软件工程师,在联邦数据库产品上有三年多的开发和测试经验,参与过 Federated Server V9.5 关于 XML 的全球化测试项目,目前从事该产品的系统测试工作,曾在 developerWorks 上发表过关于 EXCEL 和 XML 集成的文章。




对本文的评价








IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款