【发布时间】: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