使用映射设计器

Version 23.4.8843


使用映射设计器


在端口 设置 选项卡上指定源和目标模板文件后,映射编辑器 将填充源和目标 XML 的完整文档模型。 这些模型可以作为 XML 树进行遍历。

父节点和叶结点

可视化设计器中的 XML 树有两种类型的节点:

  • 节点 没有值,但是有子节点
  • 节点 有值,但是没有子节点

源中的父节点可以拖动到目标中的父节点上,源中的叶节点可以拖动到目标中的叶节点上。

遍历关系

将源父节点拖到目标父节点上会在源节点和目标节点之间建立 Foreach 关系。这意味着源元素的每次出现都会产生一个相应的目标元素,包括目标元素的所有子元素。

一旦建立了 Foreach 关系,目标中将出现一个绿色的 xpath。输入 XML 中此路径上的元素将产生节点及其子节点的新实例。从更技术的意义上讲,Foreach 关系指示端口在源中的给定的 xpath 上循环,并为找到的每个元素生成映射好的目标结构。目标树视图中的绿色 xpath 是端口将遍历的 xpath。

将源文件中的叶节点拖到目标文件的叶节点上后,端口将使用源元素中的值填充目标元素。拖放到目标节点后, xpath 的值将被读取并出现在目标树视图中。

目标树视图中显示的 xpath 是 绝对的相对的。绝对 xpath 以斜杠 (/) 开头并描述源中的整个 xpath,从文档的根开始。相对 xpath 不以斜杠开头,它们与父节点中设置的 Foreach 循环相关。

相对 xpath 可以对应多个 Foreach 循环(只要元素有多个父元素,每个父元素都映射了 Foreach 关系)。要为任何给定的相对 xpath 找到绝对 xpath,只需拼接每个父节点的 Foreach xpath,从文档顶部开始,直到到达当前节点。

映射循环

父节点(Foreach 循环)应在映射叶节点之前进行映射。建立循环关系需要了解源 XML 和目标 XML 结构:每当源中的重复元素导致目标中的元素重复时,这些元素就应以 Foreach 关系映射在一起。

Foreach 循环中,叶子元素的 xpath 与映射的 Foreach xpath 相关联。

作为一个非常简单的示例,请考虑以下源 XML 和目标 XML,其中应将嵌套 XML 结构转换为平面 XML 结构:

<Source>
  <customer>
    <name>
      <first></first>
      <last></last>
    </name>
    <address>
      <streetLine1></streetLine1>
      <streetLine2></streetLine2>
      <city></city>
      <state></state>
    </address>
  </customer>
</Source>
<Destination>
  <customerInfo>
    <firstName></firstName>
    <lastName></lastName>
    <addressLine1></addressLine1>
    <addressLine2></addressLine2>
    <city></city>
    <state></state>
  </customerInfo>
</Destination>

源中 customer 元素的每次重复都将影响目标中的 customerInfo 元素,因此应将这些父元素映射在一起以形成 Foreach 关系。然后,每个叶子元素的映射很简单:

请注意,叶子元素的 xpath 对应于父元素(定义 Foreach 关系的 xpath)。

非必要的父节点

建立 Foreach 关系时,在源文件和目标文件中仅需要存在一个映射元素的实例。换句话说, Foreach 关系要确保输出元素的数量与相应输入元素的数量匹配。

为了清楚起见,请想象在上面的示例中,源文件(即输入 XML 的模板)具有多组 customer 元素组。在 customer(源)和 customerInfo(目标)之间建立单个 Foreach 关系,对于任何输入文件,都可以确保 customerInfo 元素组的数量与 customer 元素组的数量相匹配。由于只需一个 customer 元素即可建立 Foreach 关系,因此所有其它的 customer 元素与映射无关,可以忽略(或删除)。

同样,如果以上示例中的目标文件具有多个 customerInfo 元素,则应删除其它的所有元素。customercustomerInfo 之间的 Foreach 关系仍将确保 customerInfo 元素组正确出现在输出的 XML 中。

测试映射

使用 测试映射 按钮检查的映射是否按预期工作。 该测试使用源文件中的值填充目标元素,如下所示:

如果测试失败,目标窗格会提供失败的解释。

映射多个循环

XML 映射通常在同一文件中出现多个 Foreach 循环关系。映射循环的原理保持不变:源 XML 中任何重复的父元素都应在目标 XML 中为重复元素的映射生成一个循环。外循环应在内循环之前映射(换句话说,从 XML 结构的顶部开始并向下进行)。在映射任何叶子元素之前,应先映射所有循环关系。

作为一个常见示例,请考虑将传入的采购订单报告映射到目标数据库。这样的映射包含两个不同的元素结构,这些结构可能重复(因此每个结构都需要一个 Foreach 关系):(1)一个报文可能包含多个单独的订单,并且(2)一个订单可能包含多个订单行项目。

输入示例

源模板结构如下所示:

<OrderReport>
  <WebOrder>
    <CustomerName>John Doe</CustomerName>
    <PurchaseDate>12/21/22</PurchaseDate>
    <Line>
      <ItemName>Hammer</ItemName>
      <ItemCost>1500</ItemCost>
      <ItemQuantity>1</ItemQuantity>
      <ItemDescription>Standard claw hammer</ItemDescription>
    </Line>
    <Line>
      <ItemName>Nail</ItemName>
      <ItemCost>10</ItemCost>
      <ItemQuantity>20</ItemQuantity>
      <ItemDescription>Ten penny nails</ItemDescription>
    </Line>
    <Subtotal>1700</Subtotal>
    <TaxPercent>4</TaxPercent>
  </WebOrder>
</OrderReport>

为了简洁起见,此示例仅包含一个 WebOrder 元素,但是该映射应处理在同一 OrderReport 中包含多个 WebOrder 的情况。

输出示例

此映射的输出应与数据库插入的 XML 模型匹配。数据库插入的 XML 模型由数据库端口(例如 MySQL 端口、SQLite 端口、CData 端口等)和数据库端口中的模板文件自动创建。本节讨论如何在 XML Map 端口中将这些 XML 模型用作模板文件。

正确的数据库设计建议将数据插入两个单独的表中,一个用于订单,一个用于订单行项目。为此方法生成适当的输入映射,如下模板结构:

<Items>
  <Order>
    <FirstName></FirstName>
    <LastName></LastName>
    <Date></Date>
    <OrderLine>
      <Name></Name>
      <Desc></Desc>
      <Price></Price>
      <Amount></Amount>
    </OrderLine>
  </Order>
</Items>

在此示例中,Order 元素表示在订单表中的插入,而 OrderLine 元素表示在订单行项目表中的插入。生成的模板只包含一个代表每个表的元素,但是在映射过程中建立的 Foreach 关系将确保创建适当数量的插入。

OrderFirstNameLastNameDate)的其它子项代表订单表中的列,OrderLine 的子项(SKUPrice 等)代表订单行项目表中的列。

建立循环关系

源中的 WebOrder 元素需要插入到订单表中,因此应将其拖动到目标中的 Order 元素上。同样,源中的 Line 元素应在订单行项目表中产生新的插入,因此应将其拖动到目标中的 OrderLine 元素。

建立这两个 Foreach 关系后,可视设计器如下所示:

建立循环关系并删除所有非必要的目标元素之后,可以映射叶子元素以填充目标值:

最佳实践

Foreach 循环是映射目标文件中重复元素的强大工具。 但是,遵循这些最佳实践以确保正确的功能并避免性能问题很重要:

  • 使用大型 XML 文件时,避免将整个文件映射为“Foreach”循环。 这种映射方式指示端口将整个文件加载到内存中,这会导致处理时间过长。

  • 相反,最佳做法是牢记完整的源文档结构,并且只为已知重复的元素创建 Foreach 关系。 这种做法最大限度地减少了与 Foreach 关系相关的性能影响。