如何在 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 的新手,如有任何帮助,我们将不胜感激。

您可以采取以下几种方法:

  1. 在转换为XML之前在JSON中进行转换——JoltTransformJSON processor handles complex transformations and has more documentation around that process (as well as online sandboxes for testing)
  2. 在 XSLT 中进行转换 -- 如果您对 XSLT 更熟悉,可以使用 TransformXML. There are many Stack Overflow answers 进行转换,这将帮助您制作 XSLT
  3. Write a Groovy script -- 如果转换逻辑难以在 Jolt 或 XSLT 中制作,Groovy 脚本 ExecuteScript 可能是最简单的解决方案。 Groovy 的 XML 处理非常简洁,并允许使用 map/object 鸭式输入进行强大的操作。如果 Jolt 或 XSLT 规范非常重要,这将是我的建议
  4. 编写自定义处理器 -- 如果您构建的脚本运行良好,您可以将该代码迁移到自定义处理器以获得长期利益(性能改进、可部署性、版本控制、可配置性等)。我 recent slides 在开发自定义处理器的过程中