如何在 Apache Nifi 中转换 XML
How to transform XML in Apache Nifi
在 NiFi 中,我有一个处理器 ExecuteSQL,其中 returns 以下
person_id| name | adress
01 | John | Street 01
01 | John | Street 02
02 | Deby | Street 01
请注意 Adress 与 Person 不同 table,因此 Left Join 最终会重复值。
在 Nifi 中,我将 AVro 转换为 Json,然后转换为 XML,结果如下:
<person>
<person_id>01</person_id>
<name>John</name>
<address>Street 01</address>
</person>
<person>
<person_id>01</person_id>
<name>John</name>
<address>Street 02</address>
</person>
<person>
<person_id>02</person_id>
<name>Deby</name>
<address>Street 01</address>
</person>
但是我想要的结果是:
<person>
<person_id>01</person_id>
<name>John</name>
<addresses>
<address>Street 01</address>
<address>Street 02</address>
</addresses>
</person>
<person>
<person_id>02</person_id>
<name>Deby</name>
<addresses>
<address>Street 01</address>
</addresses>
</person>
Nifi可以吗?我似乎无法为此找到任何 suitable 处理器,我应该使用 XSLT(带有 Transform XML 处理器)吗?写我自己的处理器?我该怎么做?
我是 NiFi 的新手,如有任何帮助,我们将不胜感激。
您可以采取以下几种方法:
- 在转换为XML之前在JSON中进行转换——
JoltTransformJSON
processor handles complex transformations and has more documentation around that process (as well as online sandboxes for testing)
- 在 XSLT 中进行转换 -- 如果您对 XSLT 更熟悉,可以使用
TransformXML
. There are many Stack Overflow answers 进行转换,这将帮助您制作 XSLT
- Write a Groovy script -- 如果转换逻辑难以在 Jolt 或 XSLT 中制作,Groovy 脚本
ExecuteScript
可能是最简单的解决方案。 Groovy 的 XML 处理非常简洁,并允许使用 map/object 鸭式输入进行强大的操作。如果 Jolt 或 XSLT 规范非常重要,这将是我的建议
- 编写自定义处理器 -- 如果您构建的脚本运行良好,您可以将该代码迁移到自定义处理器以获得长期利益(性能改进、可部署性、版本控制、可配置性等)。我 recent slides 在开发自定义处理器的过程中
在 NiFi 中,我有一个处理器 ExecuteSQL,其中 returns 以下
person_id| name | adress
01 | John | Street 01
01 | John | Street 02
02 | Deby | Street 01
请注意 Adress 与 Person 不同 table,因此 Left Join 最终会重复值。
在 Nifi 中,我将 AVro 转换为 Json,然后转换为 XML,结果如下:
<person>
<person_id>01</person_id>
<name>John</name>
<address>Street 01</address>
</person>
<person>
<person_id>01</person_id>
<name>John</name>
<address>Street 02</address>
</person>
<person>
<person_id>02</person_id>
<name>Deby</name>
<address>Street 01</address>
</person>
但是我想要的结果是:
<person>
<person_id>01</person_id>
<name>John</name>
<addresses>
<address>Street 01</address>
<address>Street 02</address>
</addresses>
</person>
<person>
<person_id>02</person_id>
<name>Deby</name>
<addresses>
<address>Street 01</address>
</addresses>
</person>
Nifi可以吗?我似乎无法为此找到任何 suitable 处理器,我应该使用 XSLT(带有 Transform XML 处理器)吗?写我自己的处理器?我该怎么做?
我是 NiFi 的新手,如有任何帮助,我们将不胜感激。
您可以采取以下几种方法:
- 在转换为XML之前在JSON中进行转换——
JoltTransformJSON
processor handles complex transformations and has more documentation around that process (as well as online sandboxes for testing) - 在 XSLT 中进行转换 -- 如果您对 XSLT 更熟悉,可以使用
TransformXML
. There are many Stack Overflow answers 进行转换,这将帮助您制作 XSLT - Write a Groovy script -- 如果转换逻辑难以在 Jolt 或 XSLT 中制作,Groovy 脚本
ExecuteScript
可能是最简单的解决方案。 Groovy 的 XML 处理非常简洁,并允许使用 map/object 鸭式输入进行强大的操作。如果 Jolt 或 XSLT 规范非常重要,这将是我的建议 - 编写自定义处理器 -- 如果您构建的脚本运行良好,您可以将该代码迁移到自定义处理器以获得长期利益(性能改进、可部署性、版本控制、可配置性等)。我 recent slides 在开发自定义处理器的过程中