【问题标题】:Converting XML to Json for NiFi Split Processor with Attribute fields使用属性字段将 XML 转换为用于 NiFi 拆分处理器的 Json
【发布时间】:2021-01-24 23:53:58
【问题描述】:

在 NiFi 中,我正在尝试利用 SplitRecord 处理器将传入的 XML 文件更改为 Json。

XML文件的结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<docs>
   <doc boost="1.0">
      <field name="id">12345</field>
      <field name="name">john smith</field>
      <field name="age">34</field>
   </doc>
   <doc boost="1.0">
      <field name="id">74832</field>
      <field name="name">jane doe</field>
      <field name="age">16</field>
   </doc>
   <doc boost="1.0">
      <field name="id">08423</field>
      <field name="name">henry jones</field>
      <field name="age">29</field>
   </doc>
</docs>

我想拆分每条记录,但我也希望表示字段的属性,而不是字段本身是一个没有标识符的巨型数组。

现在,在 SplitRecord 处理器中,我正在使用 XMLreader 控制器和 JSONsetrecordWriter 控制器。如果我只是让 XML 阅读器推断架构,我会得到以下结果

{ "doc": [ {
    "field" : ["12345", "john smith", "34"]
    },
    {
    "field" : ["74832", "jane doe", "16"]
    },
    {
    "field" : ["08423", "henry jones", "29"]
    } ]
}

你可以看到所有字段都丢失了它们的元数据,我想要更接近这个的东西:

{ 
"id":"12345",
"name":"john smith",
"age":"34"
},
{ 
"id":"74832",
"name":"jane doe",
"age":"16"
},
{ 
"id":"08423",
"name":"henry jones",
"age":"29"
}

在 XMLReader 控制器中,如果我切换到使用“架构文本”属性,并在架构文本属性字段中输入此架构:

{
  "type" : "record",
  "name" : "docs",
  "namespace" : "doc",
  "fields" : [ {
    "name" : "boost", "type" : "string"
  }, 
  {
    "name" : "field",
    "type" : {
        "type" : "array",
            "items" : {
              "type" : "record",
              "name" : "field",
              "namespace" : "name",
              "fields" : [ 
              {"name" : "id","type": "string"},
              {"name":"name","type":"string"},
              {"name":"age","type":"string"}
              ]
            }
    }
  }
  ]
}

我没有得到任何结果,实际上现在的输出是这样的:

{"boost":null,"field":[]}

如果我的架构在尝试将此 XML 转换为 JSON 时出现错误,我将不胜感激。

更新

我已经确定了我的工作模式

{
  "name": "docs",
  "namespace": "doc",
  "type": "record",
  "fields": [
      {
         "name" : "field",
         "type" : {
         "type" : "array",
            "items" : {
              "type" : "record",
              "name" : "field",
              "namespace" : "name",
              "fields" : [ 
                          {"name": "name", "type": "string"},
                          {"name": "value", "type": "string"}
                         ]
                      }
                  }
       }
     ]
}

在 xmlreader 控制器中,还要设置以下属性:

架构访问策略:“使用‘架构文本’属性”

架构文本上述架构

期望记录为数组:真

内容的字段名称:值

【问题讨论】:

    标签: json xml schema apache-nifi


    【解决方案1】:

    实现此目的的一种方法是创建与所需输出相匹配的第二个架构。然后使用 JoltTransformRecord 运行 Jolt 转换。您可能希望像这样分两步进行:

    Convert/SplitRecord -> JoltTransformRecord

    此外,对于您所描述的用例,请使用 ConvertRecord 而不是 SplitRecord,除非您有很多记录并且只想拆分。如果您将记录拆分为一条记录,那将是一个非常低效的流程。 Record API 可以轻松处理从 1 条记录到数百万条记录的任何地方。

    【讨论】:

    • 感谢@Mike Thomsen,我会接受您的注意,改用 ConvertRecord。因此,我从您所说的内容中收集到,使用模式无法以我想要的格式直接从 XML 转换为 JSON,我还需要 JoltTransformRecord 吗?
    • 我已经能够确定架构,我会将它作为对原始帖子的更新发布给任何可能有帮助的人。我也会接受你的回答,因为它确实帮助了我的流程应该是什么样子
    • 更正需要进行第二步。 Convert/SplitRecord 无法在一个步骤中将记录转换到该程度,因为它们不是为此而设计的。
    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多