内容


使用 WebSphere DataStage XML 和 Web Services 包转换和集成数据

Comments

简介

DataStage XML 和 Web Services 包概述

Ascential DataStage 是 IBM 在 2005 年收购得到的,现名 IBM WebSphere DataStage。它是一款方便的、基于 GUI 的提取、转换和装载(ETL)工具,可用于集成不同结构和格式的数据,并且有效地支持客户关系管理(CRM)分析、决策支持系统(DSS)和电子商务。

DataStage 基于一个客户机-服 务器基础设施,包括设计器、管理器、导控器(director)和管理员组件,同时提供了健壮的功能。DataStage 可以大大简化从开发到维护的任务。

DataStage 的 XML 包和 Web Services 包是本文的焦点。通过这两个包,很容易将 XML 和 Web 服务集成到 DataStage 解决方案中。使用 DataStage 的这两个包的优点有:

  1. 缩短开发时间
  2. 加快用户响应
  3. 用户友好的开发、管理和维护 GUI 环境

DataStage XML (DataStage 的 XML 包)由 XML 摘要、XML 发布和转换功能组成。本文的 XML 部分介绍 XML 包提供的一种主要的转换:XML 文档与表数据之间的转换。

Web Services 包能够使 DataStage 可以调用远程服务,并将那些远程服务当作简单的数据源、数据目标或交互式数据接口。本文的 Web 服务部分将介绍提供交互式数据接口的 Web Services Transformer。

本文包括 4 个关于使用 DataStage(Version. 7.5.1A,安装了 XML 和 Web Services 包) 开发数据解决方案的示例,对于每个示例都进行了分析和注解。这 4 个示例基于以下典型的场景:

  • 根据表数据发布 XML 文档
  • 将 XML 文档解析为表数据
  • 访问具有输入和输出数据的 Web 服务

先决条件

  • 安装有 WebSphere DataStage V7.5.1A,其中含 DB2® 包、XML 包和 Web services 包。
  • 安装有 IBM® DB2 for Linux®, UNIX®, and Windows® V8.2(或更高版本)。
  • 读者具有 XML、Web 服务和 DB2 等方面的一些实践经验,并且有 DataStage 方面的基础知识。

第 1 部分. 根据表数据发布 XML 文档

根据已有的表数据发布 XML 文档是一个常见的场景。有时候,需要将关系表或顺序文件转换成 XML 分层结构,例如 XML 文档或 XML 块。在这个例子中,可以使用 XML 输出 stage 来生成 XML 输出。它使用 XPath 表达式将输入表字段映射到输出文档中的某些位置。

示例 1. 使用 XML 输出 stage 根据两个表生成 XML 文件

图 1. XML 发布的任务图
XML 发布的任务图
XML 发布的任务图

示例 1 概述

在示例 1 中,分别从两个对应的 DB2 表中提取客户数据和联系方式数据,如 图 1 所示。接着,使用转换器替换复杂的 SQL,集成数据,并通过 DSLink6 将连接后的数据提供给 XML 输出 stage。然后,XML 输出 stage 生成 XML 结果,并将结果保存到文件系统。图 1 简要地描述了整个应用程序 demo。

部署的通常步骤是:

  1. 定义和部署 DB2 表
  2. 准备 XML 结构
  3. 导入 DB2 表和 XML 表定义
  4. 设置 DB2 stage,以便用转换器提供连接的数据
  5. 设置 XML 输出 stage,以生成 XML 文档
  6. 编译和运行

我们来详细讨论这些步骤:

步骤 1. 定义和部署 DB2 表

使用清单 1 中的 DDL,将这些表部署到本地 DB2 服务器上的示例数据库中,并装载一些示例数据,如图 2.12.2 所示:

清单 1. 用于客户表和联系方式表的 DDL
--customer table
CREATE TABLE S_CUST
(
    CUST_NUM  CHARACTER(10) PRIMARY KEY,
    CUST_NAME VARCHAR(100)  NOT NULL
);
--contact table
CREATE TABLE S_CONTACT
(
CNT_NUM  INTEGER
GENERATED  ALWAYS AS IDENTITY( START WITH 1, INCREMENT BY 1 )
PRIMARY KEY,
    CUST_NUM CHARACTER(10) NOT NULL,
    F_NAME  VARCHAR(50)   NOT NULL,
    L_NAME   VARCHAR(50)   NOT NULL,
    EMAIL    VARCHAR(100)  NOT NULL
);
图 2.1. 客户表的示例数据
Customers
图 2.2. 联系方式表的示例数据
Contacts
Contacts

步骤 2. 准备 XML 结构

目标 XML 结构可以通过 XSD 模式文件来定义,也可以通过 XML 示例文档来定义。清单 2 是一个要导入 DataStage 中的 XML 示例文档:

清单 2. target.xml - 示例 XML 文件
<CustomerInfo xmlns="http://www.ibm.com/schemas/SimpleXMLDemo"
    xmlns:cnt="http://www.ibm.com/schemas/ContactDemo"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<CustomerID>0000000001</CustomerID>
	<CompanyName>MindLight Corp.</CompanyName>
	<Contacts>
		<cnt:Contact>
			<cnt:FirstName>Lee</cnt:FirstName>
			<cnt:LastName>Chen</cnt:LastName>
			<cnt:Email>LeeChen@gmail.com</cnt:Email>
		</cnt:Contact>L
	</Contacts>
</CustomerInfo>

如清单 2 所示,XML 文件中有 5 个主要的字段:CustomerID、 CompanyName、FirstName、LastName 和 Email。每个字段在数据库表中有一个对应的列。

步骤 3. 导入 DB2 表和 XML 表定义

为了输入数据源信息,需要在 DataStage 中手动输入表定义,或者直接从源数据导入定义。DataStage 表定义包括很多表格式的数据源的元数据(参见 图 3),包括存放数据的表或文件的名称和位置,以及它们所包含的列的定义。这些信息存储在 DataStage 储存库中的表定义中。

这个示例从 DB2 中导入两个数据库表,并从示例文件中提取 XML 结构。

注:应该安装 DB2 和 XML 插件模块,以启用这些特性。

图 3. 表定义结构
表定义
表定义

导入 DB2 表定义

选择 Plug-in Meta Data Definitions(如图 4 所示,在红色圆圈内),导入一个 DB2 表。

图 4. 插件元数据定义
插件元数据定义
插件元数据定义

从弹出窗口中选择 DB2 plug-in,单击 OK。在 “Import DSDB2 Meta Data” 窗口的第一个页面(参见图 5),选择 SAMPLE 数据库作为导入元数据的源,并使用适当的用户名和密码。确认勾选了 TablesFully Qualified Table Names 复选框,以便下一个窗口中显示的表名中包含模式名。单击 Next 按钮。

图 5. 导入 DSDB2 元数据 1
DSDB2 元数据
DSDB2 元数据

DB2 表定义可以存储在 “PlugIn\sample” 编目中,如图 6 所示:

图 6. 导入 DSDB2 元数据 2
DSDB2 元数据
DSDB2 元数据

导入 XML 表定义

在 repository 视图中,右键单击 Table definitions,选择 Import > XML Table Definition(类似于 图 4 显示的动作)。这样做之后,XML Meta Data Importer 将被激活(参见图 7)。

图 7. XML Meta Data importer
XML Meta Data importer
XML Meta Data importer

XML Meta Data Importer 可以从 XML 示例文件或 XSD 文件中导入 XML 结构。在 XML Meta Data Importer 中打开 target.xml 文件。这个 XML 文件被打开后,就会被映射到表结构中。如图 7 所示,选择作为表定义的列的 5 个数据元素的 TEXT 字段(以红圈标记),以提取 XML 元素的文本内容。“Description” 字段(在图 7 中以红框标记)包含 XPath,它表明一个列在 XML 文档中相应的位置。在这个示例中,假设每个联系方式记录都有一个惟一的 e-mail 地址,作为“Key” 列。将表定义保存在 “PlugIn\sample” 编目中,命名为 “target_xml”。

至此,三个表定义(图 8 中以红圈标记)都已经被成功地导入到编目中。

图 8. 导入的表定义
导入的表定义

步骤 4. 设置 DB2 stage,以便用转换器提供连接的数据

有了储存库中的表定义,现在可以设置用于 XML 输出的数据源。提取数据的方式有两种:

  1. 在一个 DB2 stage 中使用 SQL,如图 3 所示。
  2. 使用转换器连接来自多个 stage 的数据

本示例采用第二种方式:

清单 3. 用于数据提取的查询
SELECT cnt.CUST_NUM,c.CUST_NAME,cnt.F_NAME,cnt.L_NAME,cnt.EMAIL
FROM S_CONTACT cnt
JOIN  S_CUST c ON cnt.CUST_NUM=c.CUST_NUM ;
图 9. 清单 3 中的查询的结果
清单 3 的结果
清单 3 的结果

要在 DataStage 中获得图 9 所示的输出,可以采用两个 DB2/UDB API stage(在 Palette 的 Database 编目中)和一个 Transformer stage(在 Palette 的 Processing 编目中)。这些 stage 被添加到一个新的任务图中,并命名如下:

  • 两个 DB2 stage:“CONTACT” 和 “CUST”
  • 转换器:“JOIN_CUST_CNT”

分别使用 DSLink3 和 DSLink4 将 “CONTACT” 和 “CUST” 连接到 “JOIN_CUST_CNT”。(参见图 10。)

图 10. 任务图
任务图
任务图

作为数据库开发人员,您通常将客户表与联系方式表连接,并将客户表视作主表。但是在本示例中,联系方式表是主表,DSLink3 的实线箭头表明了这一点。对于主表的记录,转换器对非主表进行查找。对于主表的每条记录,只从非主表中检索一条记录。

注:只有 ODBC 和 UniVerse stage 支持多行查找。

“CONTACT” stage 配置

双击 “CONTACT” stage,配置它的属性。在 “Stage” 页面,填入 DB2 连接信息:数据库名称、用户名和密码。切换到 “Output” 页面,单击 columns 选项卡。列信息包括列名、来源、类型等。可以直接对列进行编辑,或者从已有的表定义中导入列。对于这个 stage,使用导入的 CHENLI.S_CONTACT 表定义来装载列。单击 Load 按钮,在弹出的表定义窗口中选择 CHENLI.S_CONTACT,单击 OK,然后,在接下来的列选择窗口中,选择表定义中的所有列。装载好列之后,结果如图 11 所示:

图 11. 装载的列
装载的列
装载的列

设置 “CONTACT” stage 中的 SQL,以便从 DB2 中提取数据。选择 SQL 选项卡,单击 SQL Builder。默认情况下,这样做会激活 SQL Builder,这是一个 GUI 工具,用于辅助完成 SQL 查询(参见图 12)。

图 12. SQL builder
SQL builder
SQL builder

设置好 SQL 后,单击 OK。“SQL” 选项卡看上去应该如图 13 所示。现在可以选择 “View Data” 按钮查看 “CONTACT” 表的内容。

图 13. SQL 选项卡
SQL 选项卡
SQL 选项卡

至此,“CONTACT” stage 配置完毕。可以遵循相同的步骤设置 “CUST” stage。然后,两个链接上将显示两个表的图标。

“JOIN_CUST_CNT” stage 配置

现在可以配置转换器 “JOIN_CUST_CNT”,以便将两个输入 DB2 stage 聚合在一起,从而产生连接的数据。将 CUST_NUM from DSLink 3 拖放到 DSLink4 的 CUST_NUM,如图 14 所示:

图 14. 转换器 stage
转换器 stage
转换器 stage

步骤 5. 设置 XML 输出 stage,以生成 XML 文档

将 XML 输出 stage 添加到 “Palette” 的 “Real Time” 编目中名为 “Gen_Cust_XML” 的图中,并将来自 “JOIN_CUST_CNT” 转换器 stage 的链接添加到该图中,如图 15 所示:

图 15. 将 XML Output 添加到任务图中
将 XML Output 添加到任务图中
将 XML Output 添加到任务图中

双击 Gen_Cust_XML stage,以便设置它的属性。对于当前解决方案,在 “Stage” 页面上,只需在 “Document Settings” 选项卡(参见图 16)中设置 “Namespace Declarations”,并在 “Options” 选项卡(参见图 17)中设置输出 XML 文件的文件路径。名称空间声明的装载类似于从表定义中装载列 —— 从 XML 表定义中装载名称空间。

图 16. 装载名称空间声明
装载名称空间声明
装载名称空间声明
图 17. 设置输出文件路径
设置输出文件路径
设置输出文件路径

在 “Input” 页面上,需要填充 columns 选项卡。这个过程类似于为 DB2 stage 装载输出列。装载 XML 表定义 “target_xml” 之后,XML 输出 stage 如图 18 所示。

图 18. 从 XML 表定义装载列
从 XML 表定义装载列
从 XML 表定义装载列

注:在目标 XML 结构中,每个客户可以有多个联系方式,所以需要聚合每个客户的联系方式信息,以减少冗余。为此,像图 19 中那样设置 “transformation settings”:

图 19. 转换设置
转换设置
转换设置

通过使用触发器列 “CustomerID”,仅当 “CustomerID” 字段被更改为一个新值时,输出将生成一条包含一个 XML 文档的新记录。图 9 中的数据将被聚合为一个单独的 XML 文档。

回到 “JOIN_CUST_CNT” stage,通过拖动字段,将左侧的输入列链接到右侧的输出(参见图 20。)

图 20. 修改后的转换器 stage
修改后的转换器 stage
修改后的转换器 stage

单击 OK。 至此,XML 发布解决方案已经完成。

步骤 6. 编译和运行

在设计器中编译和运行这个任务。如果没有错误,那么可以将它作为一个例程任务添加到任务调度中。当在设计器中运行该任务时,如果没有发现错误,则含有相关统计信息的链接将变成绿色(参见图 21)。 如果发生了错误,那么这些链接会变成红色。为了进行调试,必须查看日志。在图 21 中,这个任务成功地生成了一个目标 XML 文件:SampleOutput1.xml

图 21. 运行示例 1 的任务
运行示例 1 的任务
运行示例 1 的任务

第 2 部分. 将 XML 文档解析为表数据

这个场景与发布 XML 数据的过程相反 —— 接受 XML 数据,将其解析到表记录中,然后将这些记录插入到数据库表中。本文将演示两个示例,以展示如何将 XML 文档解析为表数据。示例 2 是前面 XML 发布示例的反向过程,它将 XML 文档装载到客户表和联系方式表中。示例 3 包含一个更复杂的 XML 输入和 db2 输出(3 个表)。这两个例子中将使用不同的部署方法。

示例 2. 使用 XML 输入 stage 从 XML 文档中提取客户和联系方式信息

示例 2 概述

在示例 2 中,使用示例 1 中的表定义(参见 图 8),并使用一个 XML 文件准备输入数据,该 XML 文件有一家新的公司和两个联系方式(参见 input_cust_cnt.xml)。在这个例子中,使用一个文件夹 stage 来读取 XML 文件,将内容传递给 XML 输入 stage 以解析出表记录,然后使用转换器将列划分到不同的表中。图 22 显示了任务图:

图 22. 示例 2 任务图
示例 2 任务图
示例 2 任务图

“XML_CUST_CNT” stage 的预期输出如 图 9 所示。

注:在 CUST_NUM 和 CUST_NAME 列上有重复信息,它们将被传递到客户表,导致主键冲突。为了处理这个问题,可以使用一个聚合器将每个客户的重复记录合并为一个记录。

开发这个示例解决方案的通常步骤为:

  1. 设置用于读取 XML 文件的文件夹 stage
  2. 设置 XML 输入 stage
  3. 设置接收数据的 DB2 stage
  4. 配置聚合器
  5. 设置用于分发数据的转换器 stage
  6. 编译和运行

我们来详细讨论这些步骤。

对于这个示例,可以首先将 图 22 中显示的所有 stage 和链接添加到新任务中,然后逐步设置每个 stage。

步骤 1. 设置用于读取 XML 文件的文件夹 stage

双击 XML_FOLDER stage。在 “Stage” 页面中设置文件夹 pathname 属性。在 “Output” 页面中填充通配符属性(例如文件名 wildcard*.txt;对于这个例子,我们使用 *.xml)。

然后可以采用内置的表定义 “Folder” 装载用于 “XML_FOLDER” stage 的列,如 图 23 所示。“Folder” 定义包含两个字段:“FileName” 和 “Record”。“Record” 列将包含来自源文件夹的输入文件的内容。

图 23. 从 “Folder” 表定义中装载列
从 Folder 表定义中装载列
从 Folder 表定义中装载列

步骤 2. 设置 XML 输入 stage

双击 XML_CUST_CNT,打开它的属性窗口。指定 “Record” 作为 XML 源列,以便从这个列获得输入 XML 文档。然后相应地将 “Column content” 设置为 “XML document”。

图 24. 设置 XML 源
设置 XML 源
设置 XML 源

图 25 所示,在 “Output” 页面上,填充 “Transformation Settings” 选项卡和 “Columns” 选项卡,以使 “XML_CUST_CNT” stage 解析输入 XML 文档,并生成输出记录。首先,选择 Repetition element required,因为输入文档包含多个联系方式元素。然后,从 XML 表定义装载名称空间(类似于 图 16 显示的那样)。

注:如果输入文档包含多个名称空间和前缀,则名称空间声明是必需的。

图 25. “XML_CUST_CNT” stage 的转换设置
“XML_CUST_CNT” stage 的转换设置
“XML_CUST_CNT” stage 的转换设置

通常不需要手动为 XML 输入 stage 装载列定义,因为装载名称空间的同时会导致将 XML 表定义的列装载到 “Columns” 选项卡中(参见图 26)。

注:在 XML 输入 stage 中,名称空间和列是同时装载的,这与 XML 输出 stage 不同,后者必须分开装载。

图 26. “XML_CUST_CNT” stage 的输出列
Output columns of XML_CUST_CNT stage
Output columns of XML_CUST_CNT stage

每个列定义在其 description 字段中有一个 XPath 表达式,用于将 XML 文档中的某个元素映射到相应的输出数据列。这些 XPaths 是用于解析 XML 的最关键的设置。此外,key 字段指定重复元素。在这里,e-mail 元素被选作键,因为它惟一对应一个联系方式。

至此,“XML_CUST_CNT” stage 的设置即告完成。

步骤 3. 设置接收数据的 DB2 stage

首先配置 “CONTACT” 和 “CUST” 这两个 DB2 stage 的服务器信息。

但是,与之前的 DB2 stage 示例不同,现在在 DB2 stage 的 “Input” 页面上操作,因为这里使用输入链接,而不是输出链接。选择目标表(参见图 27),为每个 DB2 stage 装载列。

注:不应该包括自动生成列。

图 27. 选择目标表
选择目标表
选择目标表

对于联系方式表,没有选择 “CNT_NUM” 列,因为它是一个自动增加的 id 列,它的值是在插入新记录时自动生成的。另一方面,客户表的所有列都选择了,因为它们都来自 XML 文档。

步骤 4. 配置聚合器

由于 XML 输入 stage 将为相同的客户生成多个行,因此需要使用一个聚合器 stage 为 “CUST” stage 合并客户的冗余信息。

聚合器接收的输入数据应该与输出链接具有相同的结构,这种结构由 “CUST” stage 定义。(实际上,它是由 DB2 表 “CHENLI.S_CUST” 定义。)所以,这里装载表定义 “CHENLI.S_CUST” 作为这个聚合器的输入。

在聚合器的输出页面上,输出列为 “CUST_NUM” 和 “CUST_NAME”。这里需要定义两个输出列的来源,以消除冗余记录,如图 28 所示。

图 28. 聚合器 stage
聚合器 Stage
聚合器 Stage

双击图 28 中来源列下高亮显示的单元。这时将显示一个 “Derivation” 对话框,用于进行配置。图 29 显示了一个详细的来源配置,其中包含聚合函数 “grouped”。

图 29. Derivation 对话框
Derivation 对话框
Derivation 对话框

除了 “grouped” 之外,在 Aggregate function selection 对话框中,在其它情况下还可以使用 Max、Min、Count、Average、Sum 等函数。

步骤 5. 设置用于分发数据的转换器 stage

在转换器属性窗口中,将源链接到目标(参见图 30)。

图 30. 在转换器中分发数据
在转换器中分发数据
在转换器中分发数据

完成时,单击 OK。示例 2 现在就可以运行了。

步骤 6. 编译和运行

完成上述所有步骤后,当装载完成时,可以看到如图 31 所示的视图。

图 31. 成功装载一个 XML 文档
成功装载一个 XML 文档
成功装载一个 XML 文档

使用清单 4 中的 SQL 检查 DB2 中的表,结果如图 32 所示:

清单 4. 检查 DB2 中的表
SELECT * FROM S_CUST cust WHERE cust.CUST_NUM='0000000002';
SELECT * FROM S_CONTACT cnt WHERE cnt.CUST_NUM='0000000002';
图 32. 清单 4 中 SQL 的结果
清单 4 中 SQL 的结果
清单 4 中 SQL 的结果

示例 3. 使用一组 XML 输入 stage 将数据从 XML 文档提取到 3 个表中

示例 3 概述

在示例 2 中,XML 文档(input_cust_cnt.xml)代表这样一个典型的场景:其中包含只分发到两个表的数据,且其中一个表引用另一个表。而现在这个示例是更复杂的情况:XML 文档有多组重复元素(参见 清单 5)或嵌套重复元素(参见 清单 6),并且将数据分发到 2 个以上的表中。相应的关系模型可以描述如下:

  1. 一个头表引用 3 个或更多表
  2. 3 个或更多表嵌套在一个树结构中
  3. 1 和 2 混合

虽然这类文档很难用一个 XML 输入来处理,但它们是最常见的情况,因为可以将各种不同的相关数据一次封装到一个文档中。

清单 5. XML 文档有多组重复元素
<A>
	<A_DATA/>
	<B>
		<B_DATA/>
		<B_DATA/>
		<B_DATA/>
	</B>
	<C>
		<C_DATA/>
		<C_DATA/>
	</C>
</A>
清单 6. XML 文档有多组嵌套的重复元素
<A>
	<B>
		<B_DATA/>
		<C/>
		<C/>
		<C/>
	</B>
	<B>
		<B_DATA/>
		<C/>
		<C/>
		<C/>
	</B>
</A>

为了处理清单 5 和 6 中那样的 XML 文档,一个简单的解决方案是使用一组 XML 输入 stage,这些 stage 以转换器 stage 链接起来,以分别接收和处理文档的不同分支。在示例 3 中,元素 “Orders” 被添加到示例 2 中的 XML 结构中(参见 input_cust_cnt.xml),以构建一个新文档 input_cust_cnt_ord.xml(参见下面的清单 7)。 对于清单 5 中的每个结构,相应地会创建一个新表 “S_ORDER”(参见 清单 8)。

清单 7. Input_cust_cnt_ord.xml
<?xml version="1.0" encoding="UTF-8"?>
<CustomerInfo xmlns:cnt="http://www.ibm.com/schemas/ContactDemo" 
    xmlns="http://www.ibm.com/schemas/SimpleXMLDemo" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<CustomerID>0000000003</CustomerID>
	<CompanyName>Eastway software Inc.</CompanyName>
	<Orders>
		<OrderItem>
			<OrderNum>00001</OrderNum>
			<OrderQty>1.00</OrderQty>
			<PartId>A01</PartId>
		</OrderItem>
		<OrderItem>
			<OrderNum>00002</OrderNum>
			<OrderQty>2.00</OrderQty>
			<PartId>A02</PartId>
		</OrderItem>
		<OrderItem>
			<OrderNum>00003</OrderNum>
			<OrderQty>4.00</OrderQty>
			<PartId>A03</PartId>
		</OrderItem>
	</Orders>
	<Contacts>
		<cnt:Contact>
			<cnt:FirstName>Andy</cnt:FirstName>
			<cnt:LastName>Lin</cnt:LastName>
			<cnt:Email>AndyLin@eastway.com</cnt:Email>
		</cnt:Contact>
		<cnt:Contact>
			<cnt:FirstName>Tom</cnt:FirstName>
			<cnt:LastName>Zheng</cnt:LastName>
			<cnt:Email>TomZ@eastway.com</cnt:Email>
		</cnt:Contact>
	</Contacts>
</CustomerInfo>
清单 8. 订单表的 DDL
CREATE TABLE S_ORDER
(
    ORDER_NUM CHARACTER(5)  PRIMARY KEY,
    CUST_NUM  CHARACTER(10) NOT NULL,
    PART_ID   CHARACTER(3)  NOT NULL,
    QTY       DECIMAL(10,3)
);

在这个解决方案中,使用两层的 XML 输入 stage 来分两个阶段处理 XML 文档。在第一个阶段,使用一个 XML 输入 stage 解析客户信息,并获得联系方式和订单的 XML 块。然后,将这两个块传递给下一个阶段的两个不同的 XML 输入 stage,以提取 “S_CONTACT” 和 “S_ORDER” 表的数据。任务图如图 33 所示:

图 33. 示例 3 任务图
示例 3 任务图
示例 3 任务图

开发这个示例解决方案的通常步骤为:

  1. 设置文件夹 stage
  2. 配置 3 个 XML 输入 stages
  3. 设置用于链接相关 stage 的转换器
  4. 设置 DB2 输出 stage
  5. 编译和运行

我们来详细讨论这些步骤。

前面的小节中已经讨论了设置每个 stage 的方法。 因此,本节忽略这些细节,而将重点放在较为棘手的部分:这些 XML 输入 stage 的 “Columns” 设置。首先,通过 XML Meta Data Importer(参见 图 7)导入 XML 表定义。接着,修改定义的列列表和 XPath。

第一个 XML 输入 stage 名为 “XML_Cust”。设置它的输出链接列,以便提取表 “S_CUST” 的 CustomerID 和 CompanyName 字段,以及 <Orders/> 和 <Contacts/> 的 XML 块,如图 34 所示:

图 34. “XML_Cust” 的 Output Columns 选项卡
“XML_Cust” 的 Output Columns 选项卡
“XML_Cust” 的 Output Columns 选项卡

注:在这个特定的例子中,为了提取 XML 块,不应该将 /text() 附加在 XPath 表达式的后面,例如 “/ns1:CustomerInfo/ns1:Orders”。相应地,该列将返回元素的整个 XML 结构,并且其它 stage 很容易地进一步处理该列。

为了接收 XML 块,并产生包含对客户表的引用的记录,必须手动设置其它两个 XML 输入 stage,以获得输入列中的 CUST_NUM field 和 XML 块字段,如图 35 所示。

图 35. “XML_Contact” 的 Input Columns 选项卡
“XML_Contact” 的 Input Columns 选项卡
“XML_Contact” 的 Input Columns 选项卡

当准备好 “XML_Contact” stage 和 “XML_Order” stage 的输入列时,使用转换器 “Div_branches” 连接它们。

图 36. 在 “Div_branches” stage 中分发数据
在 “Div_branches” stage 中分发数据
在 “Div_branches” stage 中分发数据

然后,分别配置 “XML_Contact” 和 “XML_Order” stage 的输出列。

注:XML 输入 stage 与 DB2 stage 之间没有转换器来将输出字段映射到 DB2 列。所以必须确保 XML 输入 stage(“XML_Contact” 和 “XML_Order”)中输出列的名称与数据库表中的名称一致。完成这些设置后,DB2 stage 中的输入列将被自动装载。不要通过重新装载表定义覆盖 DB2 stage 中的输入列,否则前面 XML 输入 stage 中的 XPath 将丢失。

图 37. “XML_Contact” stage 的输出列
“XML_Contact” stage 的输出列
“XML_Contact” stage 的输出列
图 38. “XML_Order” stage 的输出列
“XML_Order” stage 的输出列
“XML_Order” stage 的输出列

注:两个 XML Input stage 的输入和输出列中都有 “CUST_NUM” 字段。这个字段是一个 “传递(pass-through)” 字段,它被直接从输入链接传递到输出链接。

在设置所有 stage 之后,运行任务,应该可以看到如图 39 所示的一个成功视图。

图 39. 成功地将一个 XML 文件装载到 3 个表中
成功地将一个 XML 文件装载到 3 个表中
成功地将一个 XML 文件装载到 3 个表中

检查 DB2 中的数据。

清单 9. 用于检查表数据的 SQL
SELECT * FROM S_CUST    cust WHERE cust.CUST_NUM='0000000003';
SELECT * FROM S_CONTACT cnt  WHERE cnt.CUST_NUM='0000000003';
SELECT * FROM S_ORDER   ord  WHERE ord.CUST_NUM='0000000003';
图 40. 清单 9 中的 SQL 的结果
清单 9 中的 SQL 的结果
清单 9 中的 SQL 的结果

第 3 部分. 访问具有输入和输出数据的 Web 服务

通过 Web Services 包,DataStage 很容易在一个 DataStage 服务器任务中访问 Web 服务操作。Web service 包将添加两个实时 stage 到 DataStage 中:Web 服务客户机 stage 和 Web 服务转换器 stage。当使用 Web 服务作为数据源或数据目标时,使用 Web 服务客户机 stage。在这种情况下,一个 Web 服务操作中只需要一个输入或输出链接。但是,Web 服务转换器 stage 同时具有输入链接和输出链接,可以在数据事务中与远程服务交互。Web services 包还使 DataStage 支持 Web 服务例程,Web 服务例程被用于作为转换器 stage 中的转换器函数。本文的这一部分只使用和讨论示例中的 Web 服务转换器,因为它是用于在 DataStage 中采用 Web 服务的最典型、最灵活的 Web 服务转换器。Web 服务客户机 stage 和 Web 服务例程更简单一些,“Web services Pack Designer Guide”(参见 参考资料)中对它们作了很好的说明。

为了将一个 Web 服务转换器集成到一个解决方案中,需要导入 WSDL Web 服务描述文件,将 Web 服务转换器添加到解决方案中,并在这个 Web 服务转换器中选择目标服务。然后,向它提供数据,并以适当的方法处理输出,例如将数据提取并保存到文件或数据库中。下面的示例用于通过一个实际案例演示该特性。

示例 4. 用来自数据库表的关键字查询 Google,并将响应存储在另一个表中

示例 4 概述

这里选择 GoogleSearch 服务作为目标服务,因为它是一个典型的场景:提交一个查询,然后返回记录。此外,这个 Web 服务方便使用并且是免费的。GoogleSearch 服务在 Google SOAP Search API 项目(参见 参考资料)中,其中包括 3 个操作:doGoogleSearch、doGetCachedPage 和 doSpellingSuggestion。 在这个例子中,使用 doGoogleSearch 操作。在访问该服务之前,必须注册一个免费账户(一个 Web 页面地址),以获得一个许可键,这个许可键包含在被请求的消息中被发送,用于标识请求者。在 doGoogleSearch 操作的事务中,先将一个查询和许可键发送给 Google,然后返回一个响应消息,其中包含一些命中结果,以重复结构表示。

注:这里有一个限制,DataStage 7.5.1A 中的 Web 服务转换器不能将响应中的重复元素解析到多行记录中。每个输入行只能生成一行输出数据。幸运的是,Web 服务转换器使用 XPath 从响应文档中提取数据,并支持 XML 块输出。因此,可以从原始消息中提取包含重复结构的 XML 块,然后将它们传递到接下来的 XML 输入 stage。通过这种方法可以绕过上述限制,甚至可以处理更复杂的结构。

示例 4 的目标解决方案将从一个 DB2 表中提取查询关键字,并将它们提供给 Web 服务转换器。Web 服务转换器将调用 Web 服务,并将响应消息直接输出到下一个 XML 输入 stage。最后,将结果放入另一个 DB2 表。任务图如图 41 所示:

图 41. 示例 4 预期的任务图
示例 4 预期的任务图
示例 4 预期的任务图

在这个示例中,将采取一些步骤来设置该任务,这些步骤包括:

  1. 从 WSDL 文件导入目标服务
  2. 设置 Web 服务转换器
  3. 设置 XML 输入 stage
  4. 创建 DB2 表,并为输入和输出设置数据库 stage
  5. 编译和运行

我们来详细讨论这些步骤。

步骤 1. 从 WSDL 文件导入目标服务

在 repository 视图中右键单击 Table Definition,选择 Import > Web Services WSDL Definitions (参见 图 4)。这样将激活 Web Services Meta Data Importer(参见图 42)。使用它装载 WSDL 文件。选择目标操作,然后单击 Import 按钮保存定义。

图 42. Web Services Meta Data Importer
Web Services Meta Data Importer
Web Services Meta Data Importer

对于导入的一个操作,将生成一些表定义。 doGoogleSearch 也不例外。假设会自动创建以下表定义:

  • Info_WS:Web Services Meta Data,例如 URI、端口名等
  • doGoogleSearch_IN:输入参数
  • doGoogleSearch_MSGIN:输入消息元数据
  • doGoogleSearch_MSGOUT:输出消息元数据
  • doGoogleSearch_OP:操作元数据
  • doGoogleSearch_OUT:输出参数

步骤 2. 设置 Web 服务转换器

Web 服务转换器是这个解决方案的核心组件,因为输入和输出的数据结构完全取决于它。因此,Web 服务转换器拥有高优先级。在 Web 服务转换器的 stage 页面,只需配置 Web 服务操作,以访问一个开放的公共服务,例如这个示例中所讨论的含有基本函数的 GoogleSearch。

注:而且,stage 页面还提供了很多其它选项,例如设置代理、HTTP AUTH、HTTP、Web 服务参数等,用于更高级的应用。

为了为 Web 服务转换器配置目标操作,在 “Stage” 页面中单击 Select Web Service Operation,然后在 Web 服务浏览器中双击目标操作,如图 43 所示:

图 43. Select Web Service Operation
Select Web Service Operation
Select Web Service Operation

切换到 “Input” 页面的 “Input Message” 选项卡(参见图 44)。

图 44. 装载输入消息元数据
装载输入消息元数据
装载输入消息元数据

单击 Load Message Information,以便从所选择的 Web 服务操作中自动装载元数据、名称空间和列。

图 45. 装载元数据的同时也装载输入列
装载元数据的同时也装载输入列
装载元数据的同时也装载输入列

图 45 中显示的列是 doGoogleSearch 操作中需要提供给 Google 的实际参数,例如许可键(key)、查询关键字(q)和很多其它配置参数。

输出链接的设置类似于输入链接 —— 在它的 Output 页面的 “Output Message” 选项卡中装载元数据。如示例 4 的步骤 1 所述,使用一个 XML 输入 stage 处理响应中的重复元素。该 Web 服务转换器的输出链接必须进行定制,以输出响应的整个 SOAP 文档。在图 46 中,列 “RS_XML” 包含一个有效 XML 文档格式的响应:

图 46. 定制的 “GoogleWST” stage 输出列
定制的 GoogleWST stage 输出列
定制的 GoogleWST stage 输出列

步骤 3. 设置 XML 输入 stage

前面的示例已经讨论了 XML 输入 stage 的配置(参考示例 2 的步骤 2)。这里惟一的不同在于输出链接的表定义,它不是来自一个导入的 XML 表定义,而是来自 Web 服务输出表定义,即 “doGoogleSearch_OUT”。在这个表定义中有很多个列,它们分别表示响应消息中定义的每个数据元素。出于测试的目的,本示例只使用其中的一部分列:URL、片段、标题、缓存大小、相关信息、主机名和查询关键字本身。

图 47. “RS_parsing” XML 输入 stage 的输出列
RS_parsing XML 输入 stage 的输出列
RS_parsing XML 输入 stage 的输出列

注:URL 列被设为 “Key” 列,因为它可以区分返回的每条搜索命中结果。

步骤 4. 创建 DB2 表,并为输入和输出设置数据库 stage

创建一个简单的查询表 “S_GOOGLE_Q”,其中仅包含 id 和关键字字段,再创建一个名为 “S_GOOGLE_RS” 的结果表,其中包含前面提到的所有响应列:

清单 10. 查询表和响应表的 DDL
CREATE TABLE S_GOOGLE_Q
(
Q_ID                        INTEGER
GENERATED  ALWAYS AS IDENTITY( START WITH 1, INCREMENT BY 1)
                            PRIMARY KEY,
KEYWORD VARCHAR(255)
);

CREATE TABLE S_GOOGLE_RS
(
R_ID                        INTEGER
GENERATED  ALWAYS AS IDENTITY( START WITH 1, INCREMENT BY 1)
                            PRIMARY KEY,
URL                         VARCHAR(255) NOT NULL,
CACHEDSIZE                  VARCHAR(255) NOT NULL,
HOSTNAME                    VARCHAR(255) NOT NULL,
RELATEDINFORMATIONPRESENT   VARCHAR(255) NOT NULL,
SNIPPET                     VARCHAR(255) NOT NULL,
TITLE                       VARCHAR(255) NOT NULL,
SEARCHQUERY                 VARCHAR(255) NOT NULL
);

为两个 DB2 表设置两个 DB2 stage “REQUESTS” 和 “RESULTS”。在 “REQUESTS” DB2 stage 中,列应该包括 doGoogleSearch 操作所需的所有字段。还需从 Web 服务表定义 “doGoogleSearch_IN” 中装载表定义。

:如果 SQL 类型列是 “未知的(unknown)”,如 图 45 所示,那么必须为其赋予一个常规类型,例如 “VarChar”。

图 48. “REQUEST” DB2 stage 的输出列
REQUEST DB2 stage 的输出列
REQUEST DB2 stage 的输出列

SQL 标签页中选择 Enter custom SQL statement,并输入一个查询,以便从 “S_GOOGLE_Q” 表提取关键字,包括用于 Web 服务操作的其它输入参数(参见 图 49)。

图 49. 使用定制的 SQL 语句准备数据
使用定制的 SQL 语句准备数据
使用定制的 SQL 语句准备数据

必须使用一个转换器将 “REQUEST” stage 连接到 “GoogleWST” stage。否则,即使两个 stage 中的列名完全匹配,该任务也不能开始。这可能是由于 Web 服务表定义中的 “UnKnown” SQL 类型导致的。

图 50. “COL_mapping” 转换器设置
COL_mapping 转换器设置
COL_mapping 转换器设置

现在配置 “RESULTS” DB2 stage。这里只需配置服务器信息和选择目标表。XML 输入 stage “RS_parsing” 的表定义中的列名(参见 图 41)与数据库表中的列名完全一致。DB2 stage 可以自动将这些列插入到 DB2 表中,因为它使用输入列的列名来创建插入语句。

步骤 5. 编译和运行

完成上述设置后,这个任务就可以编译和运行了。但是,在访问在线服务之前,在查询表中应该准备一些关键字。例如,使用 3 个关键字 “Beijing”、“space shuttle” 和 “iguana”(参见图 51)。

图 51. 成功完成 google 搜索
成功完成 google 搜索
成功完成 google 搜索

在图 51 中,可以看到有 30 条记录被插入到结果表中 —— 每个关键字 10 条记录。检查 “S_GOOGLE_RS” 表,以查看这些数据。

清单 11. 检查从 google 返回的结果的 SQL
SELECT searchquery, url, hostname FROM S_GOOGLE_RS;
图 52. 清单 11 中 SQL 的结果
清单 11 中 SQL 的结果
清单 11 中 SQL 的结果

附:使用用户定义消息调用 Web 服务

有时候,输入消息非常复杂,或者消息体已经存在。这时,使用表数据作为输入可能不是最佳解决方案。

Web 服务转换器支持用户定义消息,并且可以接收 XML 文档作为消息体。该特性提供了更多的灵活性。可以选择适当的方法来准备请求消息,例如手动输入一个消息文档,或者使用第三方程序根据数据库生成复杂的 XML 文档。

为了展示用户定义消息的使用,可以稍微修改示例 4 中的任务,使用一个文件夹 stage 将 XML 文件(googleReq.xml)提供给 Web 服务转换器。新任务如图 53 所示:

图 53. 使用用户定义消息的 Web 服务任务
使用用户定义消息的 Web 服务任务
使用用户定义消息的 Web 服务任务
图 54. Web 服务转换器 stage 的用户定义消息设置
Web 服务转换器 stage 的用户定义消息设置
Web 服务转换器 stage 的用户定义消息设置

结束语

XML 和 Web services 包是强大而方便的工具包。本文通过 4 个示例讨论如何根据 DB2 表发布 XML 文档,如何从 XML 文档中提取数据,以及如何使用访问 Web 服务,并给出了关键的过程和分析。

DataStage 还提供了很多其它有用的组件,并且允许以直观的方式组合使用这些组件来构建非常灵活的集成解决方案。

在实践中,您一定能发现 DataStage 的 XML 和 Web 服务功能以及其它 DataStage 组件的更多有趣的应用。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, XML, SOA and web services, WebSphere
ArticleID=253920
ArticleTitle=使用 WebSphere DataStage XML 和 Web Services 包转换和集成数据
publish-date=09062007