级别: 中级 Susan Malaika, 高级技术人员, IBM Christian Pichler, Data Server Solutions(带薪实习), IBM
2008 年 8 月 04 日 理解 IBM® DB2® pureXML™ 和 IBM
WebSphere® DataPower® SOA Appliance
如何互为补充,从而实现强大的应用程序,并提供对通过验证的 XML 文档的灵活、快速的访问。WebSphere DataPower Appliance 执行 XML 验证,而 DB2 pureXML 数据库则管理 XML 存储、索引和查询。
简介
行业格式对于跨行业(包括医疗、保险、金融等)的不同信息系统之间的标准化信息交换十分重要。这些格式都是基于 XML 的。XML 模式定义文档的结构,所有派生的文档都必须遵从这种结构。除了 XML 模式外,还可以使用另一种基于 XML 样式表转换的语言 Schematron 来指定一些规则,以便断言 XML 文档的内容。虽然 DB2 pureXML 也支持 XML 模式注册、XML 文档验证和 XML 样式表转换,但是 WebSphere DataPower
SOA Appliances 可以弥补 DB2 pureXML 解决方案的不足。例如,除了 DataPower 的路由和安全特性外,它们可以利用 IBM
WebSphere DataPower 的 XML 功能减轻 DB2 处理程序在 XML 验证和转换方面的工作。
本文演示 XML 文档在成功通过 DataPower
SOA Appliance 的验证之后,在 DB2 pureXML 数据库中的本地存储,如 图 1 所示。通过 DataPower 框执行的验证包括根据 XML 模式对 XML 文档进行验证和使用 Schematron 的内容验证(关于 Schematron 的更详细的信息,请参阅本文 参考资料 小节)。
图 1. 简化的场景
这种解决方案的一个主要优点是,WebSphere DataPower Appliance
执行所有的验证步骤、适当的错误处理和将 XML 文档插入到 DB2 pureXML 数据库中,使数据库处理程序不必执行验证步骤。请注意,只有在文档已经成功地通过所有验证步骤的情况下,才会执行插入。
本文是关于 WebSphere DataPower 和 DB2 pureXML 的两篇文章中的第一篇。第二篇文章将描述如何使用 DB2 pureXML 作为审计日志,以便访问和查询通过 WebSphere DataPower 路由、转换或验证的 XML 消息。
设置场景
接下来的小节对场景的设置作了一个详细的描述,包括一个样例 XML 模式、样例 XML 文档、一个 Schematron 示例、一个 DB2
pureXML 数据库、一个 Data Web Service 和一个 WebSphere
DataPower SOA Appliance 的配置。
步骤 1: XML 模式、XML 文档和 Schematron
任何基于 XML 的行业格式都可以在本场景中使用,例如,可以像在免费向公众提供的 DB2 pureXML 在线演示 “Industry Formats and Services with pureXML”(参见
参考资料)中那样使用。本文使用一个简单的 XML 模式,如 清单 1 所示,并创建相应的 XML 文档,如清单 2、3 和
5 所示。
清单 1. 样例 XML 模式(simple.xsd)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="identification" type="xs:integer"/>
<xs:element name="name">
<xs:complexType>
<xs:sequence>
<xs:element name="first" type="xs:string"/>
<xs:element name="last" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema> |
基于以上定义的 XML 模式,下面是两个 XML 示例文档:
- 第一个示例文档如 清单 2 所示,它是一个有效的文档。
- 第二个示例文档如 清单 3 所示,它包含格式良好的 XML,但是根据相应的 XML 模式,它是无效的文档,因为缺少必需的
<identification /> 元素。
清单 2. 样例 XML 文档 1(simple_1.xml)
<?xml version="1.0" encoding="utf-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="simple.xsd">
<identification>1</identification>
<name>
<first>christian</first>
<last>pichler</last>
</name>
</person> |
清单 3. 示例 XML 文档 2(simple_2.xml)
<?xml version="1.0" encoding="utf-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="simple.xsd">
<name>
<first>christian</first>
<last>pichler</last>
</name>
</person> |
为了进一步验证 XML 文档的内容,可使用一种称作 Schematron 的语言。Schematron 是一种声明性验证语言,可通过 XPath 中的一些规则规范对 XML 文档进行检查和交叉检查,对于定制的错误消息,规则将无效。本文不详细描述 Schematron,但是知道
Schematron 是由 XML 样式表转换派生而来的这一点非常重要。首先,需要以 XML 格式定义 Schematron 规则,如
清单 4 所示。这个 “规则文档” 通过使用 Schematron XSL 样式表被转换成一个 XSL 样式表。然后,将产生的新的 XSL 样式表应用到每个 XML 文档,如果 XML 文档的内容不符合预期,则产生定制的错误消息。
清单 4. Schematron 实现(simple.sch)
<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron">
<title>Simple Schematron Validation Example</title>
<pattern name="Personal Information">
<rule context="/person/name/first">
<report test="text() = 'christian'">
First name must not be 'christian'!
</report>
</rule>
</pattern>
</schema> |
以上示例在一个 XML 文档中查找名字,检查名字是否等于 “christian”,如果等于,则输出一条验证失败消息。当验证失败时,消息为 First name must not be 'christian'!。
最后,创建一个样例 XML 文档,该文档能通过 XML 模式的验证,并且满足前面定义的 Schematron 规则:
清单 5. 样例 XML 文档 3(simple_3.xml)
<?xml version="1.0" encoding="utf-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="simple.xsd">
<identification>3</identification>
<name>
<first>keith</first>
<last>wells</last>
</name>
</person> |
步骤 2: DB2 pureXML 数据库和 Data Web Services
本节描述 DB2 pureXML 数据库的设置,该数据库用于存储经过验证的 XML 文档。如清单
6 和 7 所示,该数据库只包含一个表和一个存储过程:
清单 6. DB2 pureXML 数据库的设置(setup_environment.db2)
DROP DATABASE HOSPITAL@
CREATE DATABASE HOSPITAL USING CODESET UTF-8 TERRITORY US@
CONNECT TO HOSPITAL@
CREATE SCHEMA DB2ADMIN@
CREATE TABLE DB2ADMIN.PATIENT
(ID INT PRIMARY KEY NOT NULL GENERATED ALWAYS AS IDENTITY,
COMMENT VARCHAR(500),
RECORD XML)@ |
清单 7. 用于将记录插入到 Patient 表中的存储过程的设置
CREATE PROCEDURE insertPatient (IN xmlRecord XML)
SPECIFIC insertPatient
DYNAMIC RESULT SETS 1
P1: BEGIN
INSERT INTO DB2ADMIN.PATIENT (COMMENT, RECORD) VALUES ('', xmlRecord);
END P1@ |
然后,存储过程 insertPatient 通过一个 Data Web Service 公布,如 图 2 所示,这意味着该存储过程可以被 SOAP 或 REST 请求调用。
图 2. DB2 pureXML 数据库配置概图
本文不会进一步讨论关于如何创建 Data Web Services 的细节。如果您需要更多的信息,请阅读文章
“生成面向 DB2 9 pureXML 的 Web 服务”(developerWorks,2007 年 11 月)。
步骤 3: WebSphere DataPower SOA Appliance
WebSphere DataPower SOA Appliance 是一个通用设备,除了很多其他的功能外,它还可以用于以各种不同的方式处理 XML 文档。本文讨论的该设备的功能包括根据 XML 模式验证 XML 文档以及 XSL 转换。
在详细讨论配置之前,本文先介绍一些理论背景。WebSphere DataPower SOA Appliance 可以在很多不同的方面提供服务,包括 XML Firewall、Web Services Proxy、XSL Accelerator 等。本文中的场景使用 XML Firewall。每个 XML
Firewall 包含至少一个处理策略,所有这些处理策略包括至少一个处理规则。在每个处理规则中,可以指定简单的处理动作,例如,XML 模式验证、基于 XPath 的路由、加密、XML 样式表转换等。
第一步是配置 XML 模式验证。换句话说,将 XML 文档发送到 DataPower Appliance 中的这个策略,然后根据特定的 XML 模式对其进行验证。可以通过将一个 XML 模式验证处理动作添加到处理规则中来配置 XML 模式验证,如 图 3 中的 3 所示:
图 3. DataPower SOA Appliance 的 XML Firewall
配置
如果验证动作失败,DataPower Appliance 将以一条失败消息响应请求,并将 HTTP 500 错误码返回给最初发送 XML 文档的客户机。这种情况下的标准错误消息不包含关于验证动作为何失败的任何具体信息。为了提供更多的信息,这个示例在规则中包括一个 on-error 动作,如 图 3 中的 2 所示。如果规则中的任何动作在执行期间发生任何严重错误,这个 on-error 动作将导致该策略调用另一个名为 Rule #2 的规则(如
图 4 1 所示):
图 4. DataPower SOA Appliance 的 XML Firewall 配置
如果 Rule #2 被调用,它将执行 XSL 样式表,如清单 8 所示:
清单 8. 示例 XML 文档 3(simple_3.xml)
<?xml version='1.0' encoding='UTF-8' ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions"
extension-element-prefixes="dp"
exclude-result-prefixes="dp">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="dp:variable('var://service/error-message')"/>
</xsl:template>
</xsl:stylesheet> |
清单 8 中显示的 XSL 样式表包含具体的错误消息,可以解释验证动作为何失败,并将它返回给发出请求的客户机。
DataPower Appliance 还剩下两个步骤需要执行。第一个步骤是将 Schematron XSL 样式表应用到传入的请求 XML 文档上。如果 Schematron 样式表动作产生一条错误消息,则需要将该错误消息发送回最初发送请求 XML 文档的客户机。如果没有错误,则 DataPower Appliance 应该将 XML
文档转发给 DB2 pureXML Data Web Service,后者将把有效的 XML 文档插入到数据库中。这是通过另一个 XSL 样式表转换动作完成的,如 图 3 中的 4 所示,该动作执行 XSL 样式表,如清单 9 所示:
清单 9. XSL 样式表根据 Schematron 处理结果执行 Schematron XSL 样式表并执行基于内容的路由(content_based_routing.xsl)
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions"
extension-element-prefixes="dp"
exclude-result-prefixes="dp">
<xsl:output method="xml" />
<xsl:template match="/">
<xsl:variable name="schematronResult">
<error>
<xsl:value-of select="dp:transform('local:///simple.xsl', .)" />
</error>
</xsl:variable>
<xsl:choose>
<xsl:when test="$schematronResult/error/text()">
<dp:send-error override="true">
<xsl:copy-of select="$schematronResult" />
</dp:send-error>
</xsl:when>
<xsl:otherwise>
<dp:url-open
target="http://db2:8080/healthcarepatient/rest/patient/insertPatient"
response="xml" data-type="xml" content-type="text/xml">
<q0:insertPatient xmlns:q0="urn:example">
<q0:_xFFFF_xmlRecord>
<xsl:copy-of select="." />
</q0:_xFFFF_xmlRecord>
</q0:insertPatient>
</dp:url-open>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet> |
了解通过 Data Web Service 将文档插入 DB2 pureXML 数据库是否成功也很重要。因此,DataPower XML
Firewall 将把来自 DB2 Data Web Service 的响应消息传给最初将请求 XML 文档发送到 DataPower Appliance 的客户机,说明插入操作是否成功。
演示
 | | cURL 是一个命令行工具,用于将文件传输到支持各种不同协议(包括 HTTP)的 URL。该工具可以
下载 获得。 |
|
成功设置好这个示例后,现在可以来看看 DataPower
SOA Appliance、DB2 pureXML 和 Data Web Services 如何协作。这次的演示使用本文之前定义的 XML
文档。
示例 1
清单 10. 提交第一个 XML 文档
cpichle@DAIRYFARM /tmp
$ curl --data-binary @simple_1.xml http://datapowerbox:2055/
<?xml version="1.0" encoding="UTF-8"?>
<error>First name must not be 'christian'!
</error>
cpichle@DAIRYFARM /tmp
$
|
清单 10 显示,对于 XML 文档 simple_1.xml,XML 模式验证动作已经成功。但是,
<error> 标记表明,Schematron
验证失败,因为提供的名字是
'christian'。
示例 2
清单 11. 提交第二个 XML 文档
cpichle@DAIRYFARM /tmp
$ curl --data-binary @simple_2.xml http://datapowerbox:2055/
http://datapowerbox:2055/: cvc-particle 3.1: in element person with anonymous
type, found <name> (in default namespace), but next item should be
identification
cpichle@DAIRYFARM /tmp
$
|
清单 11 显示 DataPower Appliance 在收到不遵从模式的 XML 文档时如何作出响应。错误消息表明,当与 XML 模式比较时,XML 文档不是有效的文档,而关于模式验证为何失败的细节,则包含在由该 appliance 返回的错误消息中。
示例 3
清单 12. 提交第三个 XML 文档
cpichle@DAIRYFARM /tmp
$ curl --data-binary @simple_3.xml http://datapowerbox:2055/
<?xml version="1.0" encoding="UTF-8"?>
<ns1:insertPatientResponse xmlns:ns1="urn:example"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
cpichle@DAIRYFARM /tmp
$
|
提交第三个示例 XML 文档(simple_3.xml)之后,返回另一条响应消息。返回的消息是由 Data Web
Service 生成的,它表明将 XML 文档插入 DB2 pureXML
数据库获得成功。这意味着提供的文档同时通过了 XML 模式验证和 Schematron 验证步骤。
结束语
这篇简短的文章展示了 DB2 pureXML 和 WebSphere
DataPower SOA Appliance 如何互为补充,从而实现强大的应用程序,其中 WebSphere DataPower appliance 执行 XML 验证,而 DB2 pureXML 数据库则管理 XML 存储、索引和查询。本文对于 XML
结构验证(通过 XML 模式)和内容验证(通过
Schematron)都作了描述。WebSphere
DataPower 和 DB2 pureXML 这两个产品的组合提供了对通过验证的 XML 文档的灵活、快速的访问。
致谢
感谢 Bob Callaway 和其他人士为本文提供了他们的意见和建议。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| 本文的下载文件 | download.zip | 3KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
作者简介  | 
|  | Susan Malaika 是 IBM Information Management Group(属于 IBM Software Group)的一名高级技术人员。她的专长包括 XML、Web 和数据库。她曾在 Global Grid Forum 开发过支持网格环境数据的标准。她与人合作出版了关于 Web 的专著,发表了关于事务处理和 XML 的文章。她是 IBM Academy of Technology 的成员。 |
 | 
|  | Christian Pichler 是来自奥地利维也纳技术大学的带薪实习生,正在撰写计算机工程和计算机科学双硕士学位的论文,论文主题是医疗保健。在 IBM 的实习阶段,Christian 现在从事将 XML 存储到 DB2,以及通过 Web 服务、提要和 XForm 访问 XML 方面的工作。他专长于医疗保健方面的 XML 标准。 |
对本文的评价
|