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

developerWorks 中国  >  WebSphere  >

WebSphere Integration Developer V6.1.2 中的 XML 映射,第 1 部分: 使用 XML Mapping Editor 开发映射

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论

英文原文

英文原文


级别: 中级

Shane Cartledge, 服务分析师, IBM
Peter Cinat, 软件开发人员,WebSphere Integration Developer, IBM
David Lauzon, 顾问软件开发人员, IBM
Andrea Rice, 软件开发人员,WebSphere Integration Developer, IBM
Dave Spriet, 软件开发人员, IBM

2009 年 6 月 01 日

本文将介绍如何在 WebSphere Integration Developer V6.1.2 中快速创建可靠且组织良好的 XML 映射。另外,还将介绍可用于测试和调试映射的工具,以便更方便地确定问题。

引言

映射的用途

构建中介流时,可能会出现一个原语的输出消息结构与下一个原语的输入消息结构不匹配的情况。在这种情况下,可以使用映射将消息从一个结构转换为另一个结构。消息通过中介流以服务消息对象(Service Message Object,SMO)的形式传递,此类对象具有一致的 XML 结构。使用映射编辑器时,将创建将源 XML 文档转换为目标 XML 文档的映射。映射编辑器以这些映射为参数,将生成一个 XSL 文件,用于在运行时执行实际的 XML 转换。

创建映射时,目标是构建一个会产生完整而有效的目标 XML 文档的映射。所产生的 XML 文档应该完整,其中包含所有预期的数据,而且文档应当有效,即相对于对应的模式必须匹配。

XML Mapping Editor

V6.1.2 中的 XML Mapping Editor 已经进行了修改,将使用源 XML 文档的数据填充目标 XML 文档的工作变成了直观的可视化任务。通常,源 XML 结构显示在左侧,而目标结构显示在右侧。通过在源和目标字段之间绘制连接,可以在源与目标元素及属性之间创建映射。通过编辑区域下的属性视图,可以细化和自定义在 XML Mapping Editor 内创建的映射。XML Mapping Editor 还包含测试视图,允许对示例输出 XML 进行关联和立即查看映射的输出 XML。


图 1. XML Mapping Editor 视图
XML Mapping Editor

创建映射

如何创建映射

映射通常在 Mediation Module 项目中创建,以供在特定中介流中使用。也可以在 Library 项目中创建,这样可以对依赖于 Library 的模块中的任意映射文件进行重用。

在中介流中,映射文件使用 XSL Transformation 原语创建。每个 XSL Transformation 原语与描述要对输入 XML 进行转换的映射文件关联。映射文件根据实现原语时指定的信息创建。

在处理映射时,您可能会发现总是在对两种元素类型进行映射。在这种情况下,可能会发现创建子映射比较有用,可以在映射这两种类型时进行重用。子映射是普通的映射文件,可以从使用 Submap 转换的其他映射文件进行调用。子映射可以从 Mapping editor 内创建,也可以通过右键单击 Business Integration 视图,并选择 New > XML Map 进行创建。

选择映射根

首先,确定需要更改目标文档的哪个部分,然后确定将用于填充目标文档的数据来自什么地方。知道要使用文档哪个区域后,就可以为映射选择相应的根。在中介流中使用的 XML 映射只能有单个输入/源和单个输出/目标。对于中介流,消息是 SMO 消息,划分为以下几个部分:

  • 上下文
  • 主体

您可以选择 SMO 的任意部分作为根,或者,如果需要多个部分,则可以选择 SMO 的根。在大多数情况,将仅仅需要在 SMO 的主体部分进行更改,因此主体是映射合适的根。不过,在有些情况下,可能会需要来自上下文或头 (Header) 的数据,以便恰当地填充目标主体。在有些情况下,可能还要更新目标上下文或目标头。在这种情况下,将需要使用 SMO 的根“/”作为映射的根。使用“/”作为根将允许访问源和目标 SMO 的所有区域。一旦使用所选择的根创建了 SMO 映射,就不能更改根。

映射细化

在 XML Mapping Editor 中工作时,要将源模式的元素和属性与目标的这些元素和属性关联。一旦在源和目标之间创建了关联后,这个关联就被称为转换或映射。每个映射都可以有一个细化,用于指定其所属映射类型。此部分将对细化进行描述。

Move

Move 是最为基本的映射——它获取源上的简单或复杂字段,并将其不加更改从源移动到目标。对所复制的字段的唯一更改将是命名空间前缀,用于确保其在目标文档有效。希望将某个内容从源复制到目标,而不对其进行任何更改,就建议使用 Move 细化。

Assign

希望将常量值指定给目标元素或属性时,就要使用 Assign 细化。Assign 仅可用于为简单类型字段(如 string 和 int)指定值。要创建 Assign 映射,请执行以下操作:

  1. 选择希望赋值的目标元素或属性
  2. 右键单击目标元素或属性,并选择“Create Transform”
  3. 使用 Properties 视图将所需的值分配到目标元素或属性

Local map

Local map 是用于组织映射文件的工具。它允许对复杂类型嵌套映射,以防止顶级映射包含太多的细节。务必认识到,在源和目标之间创建 Local map 本身并不会执行任何数据转换。除非在 Local map 内使用 Move 之类的细化创建映射,否则不会从源向目标移动任何数据。Local map 作为容器映射使用,用于将执行实际转换的嵌套映射(如 Move)局部化。

Local map 包含单个输入字段和单个输出字段。对于需要多个输入字段的情况,可以使用 Merge 映射替换 Local map,但是二者行为相似。

一旦在源和目标之间创建局部映射后,可以双击 Local map 细化,以导航到映射中。在 Local map 中,可以创建其他映射。您在 Local map 中将会发现可以导航到 Local map 之外,通过使用映射区域右上角的“Up a level”图标 () 可以回到父级映射。您会在 Local map 中注意到,其中使用了灰色背景来指示在嵌套映射中工作。

Local map 不可重用。如果知道所映射的源和目标类型将以相同的方式在其他映射中进行映射,请考虑使用在很多映射文件中重用和共享的子映射。有关创建子映射的更多信息,请参见本文的子映射部分。

Merge

Merge 细化与 Local map 类似,实际上也是用于嵌套其他映射的容器。与 Local map 不同,Merge 支持多个源输入。通过这样,可以从两个不同的源字段获取数据,将其合并为单个目标字段。Merge 也用于处理数组,将在本文的第 2 部分“使用数组”部分更为详细地讨论。

Submap

Submap 细化是存储在独立文件中的两个特定类型间的映射。Submap 不过是常规映射文件中的根映射,可以从任何其他映射文件进行引用,因此非常适合进行重用。由于 Submap 设计用于进行重用,因此建议将 Submap 存储在库中,以便方便地在依赖模块之间进行共享和重用。对于具有两个不同的复制类型,而二者又出于映射目的经常彼此关联,则可以使用 Submap 来在这两个类型之间创建可重用映射。

基于类型的 Submap 无法作为独立映射进行测试。为了使用某个类型作为输入测试 Submap,将需要在父映射中从 Submap 细化调用它,然后对父映射执行测试。有关测试的更多信息,请参见问题确定部分。基于全局元素的 Submap 可以使用问题确定部分介绍的测试方法独立进行测试。

在某些情况下,可能会发现无法为所需的类型创建 Submap,因为此类型未在 XSD 文件中进行定义。如果类型在 WSDL 文件中定义,就可能出现这种情况。Submap 创建向导将不允许创建使用非 XSD 定义的类型作为输入或输出的子类型。在这种情况下,可以通过进行以下操作从 WSDL 文件重构此类型:

  1. 在 Business Integration 视图中,在模块或引用的库项目的 Data Types 类别中找到所需的类型。
  2. 右键单击此类型,并选择 Refactor > Extract In-lined Business Objects

提取所需的类型后,就可以使用所提取的类型作为输入和/或输出创建 Submap。Submap 细化不可用于处理局部元素或匿名类型。对于局部元素或匿名类型,目前不能使用可重用映射。

内置函数

在 Mapping Editor 中处理字符串时,可以使用下面描述的内置函数。在进行映射时可以使用其他 XPath 函数,但需要配合使用自定义转换,具体请参见第 2 部分的“自定义”部分。

Concat

Concat 函数将源中的两个或多个字符串连接为目标中的单个字符串值。内置的 Concat 函数支持通过其属性页指定前缀、后缀和分隔符。


表 1. 示例用例数据
输入所需的输出
<cityName>Toronto</cityName>
<countryName>Canada</countryName>
<destination>Toronto,Canada</destination>

在此情况下,要实现所需的输出,可以提供以下属性使用 Concat 转换:

  • 指定输入顺序,使 cityName 为第一个输入,countryName 为第二个输入
  • 对 cityName 输入使用“,”作为分隔符

Normalize

Normalize 函数会将字符串从源移动到目标中,并在移动期间对字符串进行以下修改:

  • 删除前后的空格
  • 将字符串内的空格序列替换为单个空格

表 2. Normalize 示例
<destination> Toronto Canada</destination> <destination>TorontoCanada</destination>

Substring

Substring 函数将从源字符串提取文本。Substring 函数使用分隔符和索引来确定要从传入源字符串中提取的文本。根据指定的分隔符,源字符串将划分为多个部分。索引用于标识要使用划分后的字符串中的哪个部分。缺省索引为 0,指示将使用第一个部分。例如,假定希望从以下字符串中提取城市名:<destination>Toronto, Canada</destination>

可以通过指定“,”(逗号)作为分隔符来使用 Substring 函数。缺省情况下,0 索引将返回分隔后的字符串的第一部分,即本例中的 Toronto。

要从同一个字符串中提取国家/地区名,请指定“, ”(逗号后带空格)作为分隔符,并将索引设置为 1,从而返回分隔后的字符串的第二个部分,即本例中的 Canada。

对于无法保证源字符串中逗号后有空格的情况,可以使用 Custom 细化,并使用与此类似的 XPath 表达式:normalize-space(substring-after($destination, ","))。有关使用 Custom 细化的更多信息,请参见本文第 2 部分的“自定义”部分。

其他细化

本文中未提及的其他细化主要用于处理数组和其他结构化数据。有关剩下的细化的详细描述,请参见第 2 部分的“使用数组”和“自定义”部分。

使用条件

映射可以带条件。可以使用条件确定是否在运行时出现特定映射。对于要依赖某种条件来使用数据填充目标字段的情况,可以对该目标字段上的映射应用条件。通过对映射使用条件,可以控制映射的逻辑流。转换最多可以有一个条件,条件在适用的转换的 Properties 视图指定。可以使用 XPath 表达式或使用静态 Java 方法指定条件。在 XML Mapping editor 中处理可选的源输入时,将自动生成检查源输入是否存在的条件,以防止在源输入不存在的情况下执行映射。

XPath 条件

条件可以使用 XPath 表达式编写。计算 XPath 表达式时,条件的值将会基于表达式的返回值确定。


表 3. XPath 条件计算标准
表达式返回类型True 结果False 结果
node-set非空节点集空节点集
string长度为一个或多个字符的字符串零长度字符串
number零之外的任意数字(负数或正数)
booleantruefalse

使用 XPath 编写条件时,可以使用相对路径或绝对路径。转换的输入作为变量提供,可以插入到表达式中。条件输入区域中的内容辅助功能可以用于查看可用变量列表。还可以在条件输入区域中利用内容辅助功能来使用 XPath 函数。要在条件输入区域调用内容辅助功能,请使用 CTRL+Space。

使用相对路径时,目前不能使用 ../<element name> 之类的语法引用上一级上下文节点。对于需要访问某个输入值中不可访问的信息的情况,请使用绝对路径。下面给出了变量使用的一个示例,下面的内容辅助功能显示了 cityName 是一个可用变量:



图 2. 变量使用的一个示例
变量使用的一个示例

单击上面列表中的 cityName 变量后,$cityName 将插入到输入字段中,然后就可以继续创建 $cityName = "Toronto" 之类的条件了。

目前不支持 if-else 条件。要模拟 if-else 场景中的 else 部分,请否定原始条件即可。

要理解使用条件的基本知识,请参考下面的示例。一家旅游公司采用以下的提示格式之一为客户提供关于去哪里旅游的建议:

  • 天气将较热——请带上防晒油。
  • 天气将较冷——请带上皮大衣。

提示将取决于所选目的地的温度。对于温度高于 0°C 的目的地,将提供较热天气的建议,否则将提供较冷天气建议。您可以这样设置映射的条件:


图 3. 设置映射的条件
设置映射的条件

每个 Assign 转换都将包含一个与此类似的条件:

  • 用于指定较热天气提示的条件:/body/getBestDestinationResponse/response/celsiusTemperature>0
  • 用于指定较冷天气提示的条件:not(/body/getBestDestiantionResponse/response/celsiusTemperature>0)

条件的另一个用途是,当某个输入字段出现在源中,就使用此值,否则将使用其他输入字段的值。请看下面的情况:

输入:

  • 具体建议的可选字符串输入
  • 一般建议的必需字符串输入

输出:

  • 单个尽可能具体的建议。当有具体建议时,应该为其值,否则将使用一般建议。

在这种情况下,可能会考虑采取这种方式处理:

  • 在输入具体建议和输出建议之间创建一个 Move 细化。有具体的建议时,将进行 Move 操作,并正确地设置值。由于可选输入的条件是自动创建的,因此不需要向此转换添加其他条件。
  • 在输入一般建议和输出一般建议之间创建一个 Move 细化。为 Move 设置以下条件,使其仅在输入中没有具体建议时执行: not(/body/response/specificRecommendation)

使用条件的另一方法是将筛选器应用到可重复元素的列表上,如第 2 部分中的“筛选数组”中所述。

Java 条件

还可以使用对静态 Java 方法的调用构建条件。使用 Java 方法调用时,方法的返回值决定条件结果:


表 4. Java 条件计算标准
方法返回类型True 条件False 条件
org.w3c.dom.NodeList非空节点列表空节点列表或 null
String长度为一个或多个字符的字符串零长度字符串
int零之外的任意数字(负数或正数)
booleantruefalse

要编写 Java 方法来计算条件逻辑,请执行以下操作:

  • 在现有 Java 项目中创建新的静态 Java 方法,或创建新 Java 项目来存储此方法。
  • 确保映射项目或其中的库依赖关系包含对 Java 项目的依赖关系。
  • 除了条件输入字段外,请单击 Configure user defined functions 按钮 ()。单击 Add,然后开始键入包含您的方法的 Java 类的名称。找到之后,从可用选项列表中选择此 Java 类,并单击 OK,从而完成添加过程。
  • 在条件输入字段中,使用内容辅助功能(通过按 CTRL+Space 打开)插入相应的方法调用。

例如,假定您有:

类:TravelCompanyUtilities
方法:isDesirableCity
参数:cityName(类型为 String)

条件可能与以下所示类似:

TravelCompanyUtilities::isDesirableCity(/body/response/destination/cityName)

或者

TravelCompanyUtilities::isDesirableCity($cityName)

提示与技巧

此部分提供了一些提示和技巧,能帮助简化 XML 映射任务。本部分的提示包括:

  • 关于提高工作效率的提示:匹配映射、内容复制功能。
  • 关于使用大型模式的提示:滚动、导航轨迹。
  • 其他提示:Test Map 视图、对转换排序、详细视图和简化视图。

匹配映射

当源和目标相似,或包含类似的部分时,可以使用匹配映射功能。匹配映射将始终尝试将编辑器源侧的内容与编辑器目标侧的内容匹配。当源侧的元素或属性具有与目标侧的元素或属性相同的名称时,就得到了一个匹配。要调用匹配映射功能,请使用 Map source to target based on the name and types 工具栏按钮 ( )。匹配映射将使用 Local map(而不是 Move)对复杂类型进行映射,因此能够更为方便地对创建的映射进行调整。

例如,如果使用了 Move 转换来将源上的主体映射到目标上的主体,而又希望对主体进行一些小调整,则将需要删除 Move 转换,并在更为细粒度的级别创建各个转换。不过,使用匹配映射时,将使用 Local map,通过深入这些 Local map,可以准确地找到需要进行更改的位置。通过这样,只需要对与小调整对应的转换进行更改。

当源和目标具有相同类型的类似字段,但二者名称不同时,可以使用 Local map 对这些类似的类型进行匹配,然后在创建的 Local map 中使用匹配映射。例如,假定我们有以下的源和目标:


图 4. 匹配映射的源和目标
匹配映射的源和目标

在此级别调用匹配映射将不会找到任何匹配,将会显示错误消息,指示没有为目标中的“getWeather”元素找到匹配。不过,目标中的 GetWeather 元素需要一个 cityName 和一个 countryName,这两个内容来自源侧的 destinations 数组中的第一个元素。我们可以在源的 destinations 元素和目标的 GetWeather 元素间创建一个 Local map,从而重新设置匹配映射的开始点。


图 5. 创建 Local map 重新设置匹配映射的开始点
匹配映射的源和目标

从此 Local map 内调用匹配映射时将会映射 CityName 和 CountryName。

内容辅助功能

Mapping editor 的属性页中使用的有些输入字段包含内容辅助功能,用于在语法很重要时提供帮助。如果内容辅助功能在输入字段中可用,将会在输入字段旁边显示电灯泡图标 ( ),电灯泡上的悬停帮助将指示内容辅助功能是否可用。要调用内容辅助功能,请使用 CTRL+Space。

滚动

在编辑器中创建转换或映射时,通常的步骤是:找到源输入字段,单击源输入字段,按下鼠标按键,将一个连接拖动到目标字段上,最后释放鼠标,操作完成。使用此方法快速而方便,但是却不能同时使用编辑器的滚动栏功能。这样就很难使用大型模式,因为其中的预期转换的源和目标字段并不总是同时显示在视图中。可以使用以下方法创建不同时可见的源和目标之间的转换。

  1. 悬停在源输入字段上,单击显示的拖动手柄,但不要按住鼠标按键。

    这将启动连接创建过程,但仍然能够同时使用滚动栏。在连接线已经激活的情况下,可以将鼠标悬停到编辑器边缘附近并短暂停顿来启动滚动功能。

  2. 选择源输入字段,但不按住鼠标按键。滚动到目标中相应的匹配字段,按住 Ctrl 键并单击目标字段进行选择。最后,右键单击目标字段,并选择 Create Transform。将会在所选源和目标之间创建一个转换,然后可以根据需要对此转换进行自定义。

  3. 选择源输入字段,单击右键,并选择 Create Connection。一旦出现连接线,就可以同时使用滚动栏找到目标字段并完成转换。创建了连接后,可以将鼠标悬停到编辑器边缘附近并短暂停顿来启动滚动功能。

导航轨迹

在创建 Local map 之类的嵌套映射时,可能会发现深入元素结构之后找不到方向。在编辑器顶部有一个导航轨迹记录,可通过其知道当前在哪个嵌套元素内。单击导航轨迹的任意部分都将快速地进入关联级别的编辑器视图。

Test Map 视图

在 XML Mapping Editor 中工作时,创建映射转换时可以看到用于进行测试的 Test Map 视图。有关 Test Map 视图的详细信息,请参见问题确定

对转换排序

缺省情况下,XML Mapping editor 将基于源输入对转换列进行排序。这意味着转换自身与关联的源输入字段保持一致。在有些情况下,按目标输出排序转换列可能更为方便。因为这样可以将转换尽可能与目标输出保持一致,从而能够快速地确定特定目标上执行的是什么类型的转换。要切换排序方法,请在映射编辑器区域单击右键,并使用“Sort Transforms”菜单操作,或在本地工具栏上单击所需的排序方法(按源 或按目标 )。

详细视图和简化视图

在缺省情况下,XML Mapping Editor 使用 XML 输入和输出的简化视图。缺省情况下,模式中的有些信息可能未显示在 XML Mapping Editor 中。例如,模式中定义的选择在编辑器中显示为平面列表。为了在 XML Mapping Editor 中查看此类模型组信息,请使用详细视图。要从简化视图切换到详细视图,请使用 XML Mapping Editor 窗口右上角的下拉菜单:


除了 XML Mapping Editor 窗口中显示的详细信息外,还可以在属性视图中看到关于所选元素的一般信息。

问题确定:测试与调试

在创建映射时,最好定期对映射进行测试,以确保实现了所需的结果。任何使用全局元素作为根元素的映射都可以进行测试。例如,在中介流编辑器中为 XSL Transformation 原语创建的所有映射都是使用全局元素作为根输入的映射。未将全局元素作为根输入的映射通常作为 Submap 使用,可以通过在父映射中对其进行调用来测试。

输入文件

为了在工具中测试映射,第一步是创建或选择用于进行测试的输入文档。完成此工作的最简单方法是,使用 XML Mapping Editor 中包括的输入文档生成工具。输入文档生成工具将基于输入 XML 模式创建基本输入文档。生成了输入文档后,可以立即开始测试,并稍后可以通过添加其他元素和值来对输入进行增强。可以使用以下方法创建输入文档:

  1. 从中介流中的 XSL Transformation 原语使用 Create New XML Mapping 向导时,可以选中 Create a sample XML input file for testing the XML Map 复选框。

  2. 从 XML Mapping Editor 内,可以单击 Associate XML files 工具栏按钮,然后使用 Generate Input 按钮来创建和关联新示例输出文件。

    当映射的根输入不是全局元素时,Generate Sample Input File 按钮将禁用。具有全局元素输入的映射只能通过从其他映射对其进行调用来测试。

  3. 从 XML Mapping Editor 内,可以单击 Test Map 工具栏按钮打开 Test Map 视图。从 Test Map 视图中,单击 Associate XML files 工具栏按钮,然后使用 Generate Input 按钮创建并关联新的示例输入文件。

作为创建示例输入文件的替代方法,如果已经有了示例输入文件,可以使用 Associate XML files 工具栏按钮将现有 XML 输入文件与映射文件关联。目前,输入文件通常保存在与应用到的映射相同的项目中,显示在 Business Integration 视图的 Mapping > XML Map Test Data 类别下。

使用 Test Map 视图进行迭代测试

获得了与映射文件关联的示例输入文件后,可以使用 Test Map 视图来测试映射文件。仍然在开发映射时就可以使用此测试方法。视图将使用已经在映射文件中实现的任何转换对输入文档执行转换,即时尚未将更改保存到映射文件中也可以进行测试。通过这样,可以在将更改提交到映射文件之前确保所创建的转换能产生所需的结果。要打开 Test Map 视图,请使用映射编辑器工具栏上的 Test Map 操作 ()。

在使用 Test Map 视图时,可以通过单击 Test Mapt 视图工具栏上的 Run transformations 按钮随时刷新输出。还可以从 Test Map 视图对输入 XML 文件进行更新,也可以通过单击 Save selected input file 工具栏按钮保存这些更改。通过使用 Save selected input file as 工具栏按钮,可以将对输入 XML 文件的更改提交到新输入文件中。

Test Map 视图提供了查看输入和输出 XML 的两个方法。可视化选项卡以树的形式显示 XML,允许方便地导航和编辑各个值。可视化选项卡还提供了一些验证,如验证指定给某个简单类型的值是否有效。

使用 Integration Test Client 测试映射

除了 Test Map 视图外,还可以使用 Integration Test Client 对完成度 XML 映射进行测试。您在测试客户端创建的测试可以保存并多次重新运行。还可以在使用 Integration Test Client 进行测试时对映射转换进行调试。

要使用 Integration Test Client 测试映射文件,请在 Business Integration 视图中右键单击 XML 映射,并选择 Test。还可以在中介流中选择 XSL Transformation 节点,并单击右键调用 Test XML Map 操作。

要使用 Integration Test Client 调试映射,请在运行此事件前在 Invoke XML Map Event 详细属性中选中 Stop for debug before transformations 复选框。还可以在 XML Mapping Editor 中右键单击转换,并从 Local Debug 菜单中选择操作,从而设置断点。

在服务器上测试映射

使用上述测试方法时,映射在工具中以本地方式进行测试。在有些情况下,映射可能在工具中成功执行,但是在服务器上运行时却不正常。在这些情况下,将需要在服务器上调试问题。

技巧
在测试组件时,如果希望使用已经在某个映射输入文件中创建的输入数据,可以通过使用值池来实现此工作。在 Integration Test Client 中以本地方式测试某个映射时,可以使用来自某个映射输入文件的数据填充值编辑器。一旦数据在值编辑器中可见,就可以将各个值保存到数据池中。将值保存到数据池中后,就可以在稍后运行组件测试来测试整个中介流时使用。例如,如果在某个输入 XML 文件中创建了示例输入的数组,则可以将数组保存到数据池中,并将其作为输入用于组件测试。

在服务器上测试 XML 映射的工作可以通过测试包含要测试的 XML 映射的组件来进行。在 Assembly Editor 中,右键单击包含要测试的映射的中介流组件,并调用 Integration Test Client(使用 Test Component 或 Test Component in Isolation)。

为了明白 XSL Transformation 原语在运行时如何执行,请考虑以下场景:


  1. SMO 输入由“SortDestinations”XSL Transformation 原语接收。
  2. SMO 输出序列化为 XML 供处理。
  3. XML 输入使用与此原语关联的 XSL 文件进行转换,并生成 XML 输出。
  4. 输出 XML 反序列化为 SMO 输出对象。

Integration Test Client 中详细的跟踪信息将允许您查看中介流中每个 XSL Transformation 原语的输入和输出。在大多数情况下,如果 XML 映射在本地测试期间正常,但是运行时失败,问题应该出在上面的第 4 步,即输出 XML 到 SMO 对象的转换。此时输出 XML 和模式之间的不一致将会导致发生故障。为了帮助诊断和修复这种类型的问题,可以开启服务器跟踪,以检查消息。

打开服务器跟踪:

  1. 在 Servers 视图中,右键单击适用的服务器,并选择“运行管理控制台”。
  2. 登录到管理控制台(缺省 ID 和密码为 admin)。
  3. 在 Troubleshooting 部分,选择 Logs and Trace。
  4. 在 Logging and Tracing 区域,单击服务器名称(例如,server1)。
  5. 单击 Change Log Detail Levels。
  6. 在 Change Log Details Level 输入字段中,将以下文本添加到输入字段中已有的文本后:: com.ibm.ws.sibx.*=all

    例如,如果更改前输入字段包含此内容:*=info

    更改之后,输入字段将与以下所示类似:*=info: com.ibm.ws.sibx.*=all

  7. 单击 OK。
  8. 单击 Save,以保存更改,并将配置更改传递到服务器。
  9. 从管理控制台注销。
  10. 重新启动服务器。

启用了服务器跟踪后,重新运行测试,然后查看 trace.log 文件,此文件位于以下位置之一:

<WID_INSTALL_DIR>\pf\wps\logs\<SERVER_NAME><WID_INSTALL_DIR>\pf\esb\logs\<SERVER_NAME>

打开 trace.log 文件时,可以通过搜索此字符串找到序列化后的 SMO 实例:<smo。.

还可以通过查找以下字符串查看转换原语前后的原始 XML 数据:

Serialized DataObject prior to transformationResult of transformation

用于进行调试的另一个选项是,在 Mediation Flow Editor 中对 XSL Transformation 原语设置断点。调试程序将允许检查 XSL Transformation 原语前后的 SMO 值。

最佳实践

组织映射

在 XML Mapping Editor 中工作时,可以通过一些处理来更为方便地导航、了解和维护映射。实现映射的一项技术是,首先逐个查看目标中的字段。对于目标中的每个字段,请考虑以下事项:

  1. 是否需要填充目标字段?(是否是必需的?)
  2. 如果目标字段需要填充,数据来自哪里?
  3. 如果目标将要使用来自源 XML 中的数据填充,这些数据在源中位于何处?
  4. 源数据类型是否与目标数据类型相同?如果类型相同,并不需要以任何方式修改数据,请考虑使用 Move 转换。
  5. 如果源中的数据和目标中的数据类型不同,或需要对数据进行操作,请考虑使用 Local map 或 Submap 对源和目标进行映射。通过使用 Local map 或 Submap,将能够把映射的细节嵌套在子级转换中,从而减少映射文件根级别的混乱和混淆。
  6. 将来是否会在嵌套映射中对源和目标类型进行映射,或在当前映射中进行多次映射?如果确定这些类型经常一起映射,请考虑使用可重用的 Submap,否则就可以使用 Local map。
  7. 如果需要使用多个源输入填充单个目标,请考虑使用 Merge(特殊化的 Local map,接受多个输入)。
  8. 在 Submap 或 Local map 中,是否很多源和目标字段具有相同的名称和类型?如果源和目标之间存在很大相似性,请考虑使用匹配映射来对类似字段进行映射,然后进行进一步的自定义。
  9. 如果映射目标是复杂类型,请确保目标类型子项不是父项上的容器映射内定义的映射之外的其他映射的目标。例如,假定我们希望从源将所有上下文信息复制到目标,但是我们还希望从 body 添加一些东西到 context/correlation 中。完成此工作的正确方式是:

    图 6. 从 body 添加东西到 context/correlation 的正确方式
    匹配映射的源和目标

    以下做法是错误的,因为 context 上有一个 Move,而还有一个 Move 指向 context/correlation:



    图 7. 错误做法 1
    匹配映射的源和目标

    以下做法是错误的,因为指向 context/correlation 的 Move 不在 context 中定义的 Local map 内:



    图 8. 错误做法 2
    匹配映射的源和目标

    即使在 context 上的 Local map 不映射 correlation 元素,Move 仍然是错误的,因为它必须位于 Local map 中。

一旦确定了每个目标字段在根级别的最佳映射类型,就可以使用相同的过程在已创建的 Local map、Merge 和 Submap 转换内创建映射。

将映射从 V6.0.2 迁移到 V6.1

Integration Developer V6.1 中的 XML 映射格式发生了变化。Integration Developer 中提供了用于将 Integration Developer V6.0.2 XML 映射文件 (.xmx) 迁移到新 Integration Developer V6.1.2 格式 (.map) 的工具。导入包含 *.xmx 文件的项目之后,将会在 Problems 视图中出现警告。要启动迁移工具,请右键单击警告消息,并选择 Quick Fix,或尝试在 Integration Developer V6.1.2 中打开一个 *.xmx 文件。

完成了自动迁移后,仍然需要对所迁移的映射文件进行测试,以确保产生了所需的结果。在 V6.0.2 中,在目标 XML 中为所需的元素创建了空元素,即使这些元素不会映射到映射也是如此。不过,在 V6.1.2 中,除非显式地创建映射,否则不会创建这些空元素。由于这两个版本之间存在这一点差异,因此建议在迁移之后对映射进行测试。



参考资料



作者简介

Shane Cartledge 是 IBM 多伦多软件实验室的一名软件开发人员。


Peter Cinat 是 IBM 多伦多软件实验室的一名软件开发人员。


David Lauzon 是 IBM 多伦多软件实验室的一名顾问软件开发人员。


Andrea Rice 是 IBM 多伦多软件实验室的一名软件开发人员。


Dave Spriet 是 IBM 多伦多软件实验室的一名软件开发人员。他为 WebSphere Message Broker 开发工具,专注于面向对象的技术、XML、XML 模式和 UML 建模。他拥有 McMaster University 的计算机科学与统计学士学位(荣誉学位)。




对本文的评价










回页首


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