---
title: "节点函数简化了对分层数据结构的映射"
date: "2018-06-12"
categories: 
  - "data-integration"
  - "tools"
tags: 
  - "data-mapping"
  - "mapforce"
  - "software-tools"
description: 了解如何利用 MapForce 的节点功能，简化 XML 和 JSON 等分层数据结构的映射过程，从而简化重复的数据转换操作。
---
Status: #blog

Tags:  #data-mapping #mapforce #software-tools

Categories: [data-integration](/blog/zh/category/data-integration.md) 
# 节点函数简化了对分层数据结构的映射

MapForce 的节点功能简化了对分层数据的映射，例如 XML 节点或 CSV、JSON、EDI 数据，以及数据库字段。它允许用户在节点级别定义一个数据处理函数，并将该函数递归地应用于所有子项。

同样地，也可以为节点设置默认值，并且这些默认值会自动应用于其子节点。

默认设置和节点函数在以下情况下特别有用：当一个[数据映射和转换](https://www.altova.com/zh/mapforce)任务需要对结构中的多个子项应用相同的处理逻辑时，例如：

- 将所有子项中的空值替换为其他指定的值，该操作需要递归进行
- 将特定值（例如“N/A”）递归地替换为其他值，应用于所有子项
- 从数据库表中读取数据时，将所有数据库中的空值替换为其他值
- 移除所有值在源数据库中末尾多余的空格
- 为写入目标文件或数据库的所有值，添加自定义的前缀或后缀
- 输出值的格式设置
- 还有许多其他情况

默认设置和节点函数简化了分层数据的映射过程，因为它消除了在映射中重复复制粘贴相同函数的需求。 不必要地重复使用相同的函数会使映射布局变得混乱，从而更难以理解或修改。

我们来看一个例子。

[![](/blog/images/JSON_blog_3.jpg)](JSON_blog_3.jpg)

<!--more-->

以下是从 XML 转换到 CSV 的映射示例，取自 MapForce 示例项目中的 "OrderinUSD.mfd" 文件。该示例展示了节点函数的高效性和灵活性。

[![使用节点函数来可视化分层数据](/blog/images/node-functions-mapping.png)](node-functions-mapping.png)

这个例子展示了如何将源 XML 文件中的订单数据转换成 CSV 文本格式。此外，还需要进行以下转换：源文件中“Price”元素中的价格（以欧元为单位）需要转换为美元，并且每个订单项的名称需要全部转换为大写字母。

一个节点函数既能满足需求，其功能符号会显示在“文章”节点右侧。双击该功能符号，会打开位于映射区域上方的节点功能定义对话框：

[![用于映射分层数据的节点函数定义](/blog/images/node-functions-in-mapping.png)](node-functions-in-mapping.png)

这个单节点函数将两个 MapForce 操作结合起来，以同时执行所需的货币和字符串转换。可以通过点击左侧的图标，为节点函数添加更多行，用于设置默认值或添加函数。

每一行中的第一个字段定义了该行是否适用于单个子节点，或者适用于父节点的全部子节点。

第二个字段定义了要修改的数据类型。点击“...”按钮会打开一个对话框，如上图所示，用于选择数据类型

[![节点函数的数据类型选择](/blog/images/node-functions-by-datatype.png)](node-functions-by-datatype.png)

我们的示例只包含两类数据类型的行，但实际上，可以定义一个节点函数，使其包含所有可能的数据类型。对于父节点的每个子节点，将执行与该子节点对应的数据类型的行。

第三个字段用于指定该行是否使用函数或默认值。无论哪种情况，点击“编辑”按钮都会打开该行，以便进行定义

[![定义一种节点函数操作，用于映射分层数据](/blog/images/node-function-editing.png)](node-function-editing.png)

定义一个节点函数的过程，可以通过从“函数库”窗口拖动函数，以及/或者定义函数的常量，并将这些常量连接到数据源和输出端来实现。

在示例输入文件中，"Amount"（数量）元素实际上代表的是每个商品的订购数量，不应乘以节点函数中定义的货币转换因子。可以通过右键单击相应的函数符号，然后在上下文菜单中取消勾选“继承输出节点函数”来将“Amount”定义为例外情况。

[![在映射分层数据时，可以覆盖节点函数](/blog/images/override-node-functions-1.png)](override-node-functions-1.png)

CSV输出文件还有一个要求：每个条目的单价和小计价格必须以美元符号开头。输出文件定义显示，“单价”和“价格”列被定义为字符串类型，MapForce 会自动将源数据中的小数转换为字符串。

在输出组件的“行”节点上应用一个额外的节点函数，即可添加前导美元符号，具体操作方式如下所示：

[![为输出映射组件添加节点功能](/blog/images/node-functions-output-component.png)](node-functions-output-component.png)

为了防止此节点函数应用于所有包含字符串数据的列，我们对“公司”和“文章”两列进行了例外处理。现在，关于如何使用节点函数映射分层数据的示例已经完成。

与其他 MapForce 示例一样，为了展示结果，这里提供了一个源数据文件，用于进行数据映射。以下是在 XMLSpy [XML 编辑器](https://www.altova.com/zh/xmlspy-xml-editor)中查看的源文件：

[![](/blog/images/mapping-source-data.png)](mapping-source-data.png)

对于需要重复转换的 MapForce 映射，例如在线订单处理系统，可以使用 [MapForce Advanced Server](https://www.altova.com/zh/mapforce-server) 进行自动化。要执行映射以进行测试或一次性转换，只需在映射设计窗口下点击“输出”按钮即可。

无论如何，我们的示例映射产生了以下结果：

[![用于映射分层数据的示例结果文件](/blog/images/node-function-mapping-result.png)](node-function-mapping-result.png)

除了本文中描述的数据映射功能，MapForce还包含其他多种节点函数示例。MapForce的集成帮助系统甚至提供了一个循序渐进的教程，指导用户从零开始构建节点函数映射。

要亲身体验节点功能如何简化层次化数据的映射，请点击此处，[下载一个功能完善的 MapForce 免费试用版](https://www.altova.com/zh/mapforce/download)。

**更新：** [请查看这篇文章](https://www.altova.com/blog/mapping-structured-data-with-node-functions/)，其中介绍了另一种策略，该策略基于节点元数据（例如节点名称、节点长度、节点数据类型的精度、自定义节点注释等）来应用节点函数。
