使用NiFi接收HTTP XML请求写入Postgres的XML解析转换问题
NiFi XML解析入库解决方案
步骤1:使用EvaluateXPath处理器提取XML字段
将你已配置完成的请求接收处理器的success流关系,连接到EvaluateXPath处理器,按以下参数配置:
- Destination:选择
flowfile-attributes,将提取到的字段存为流文件属性,方便后续调用 - Return Type:选择
string - 新增7个自定义属性,对应你需要提取的字段,属性值为匹配XML的XPath表达式:
MainID://member[name='MainID']/value/string/text()origintimestamp://member[name='origintimestapmp']/value/dateTime.iso8601/text()(注意原XML内该字段拼写多了一个a,必须和XML内实际拼写一致才能匹配成功)Xvalue://member[name='Xvalue']/value/string/text()Action1://member[name='DataFields']/value/struct/member[name='Action1']/value/string/text()Action2://member[name='DataFields']/value/struct/member[name='Acttion2']/value/string/text()(注意原XML内该字段是两个t,拼写和你需求里的Action2不一致,需按XML实际拼写填写)Action3://member[name='DataFields']/value/struct/member[name='Action3']/value/string/text()Action4://member[name='DataFields']/value/struct/member[name='Action4']/value/string/text()
配置完成后,EvaluateXPath的success关系下的流文件,都会自动携带以上7个属性,空值会自动留空,和你需要的输出格式一致。
步骤2:构造PostgreSQL插入语句
将EvaluateXPath的success关系连接到ReplaceText处理器,按以下参数配置:
- Replacement Value:替换为你实际使用的表结构对应的插入语句,示例如下:
INSERT INTO 你的表名 (mainid, origintimestamp, xvalue, action1, action2, action3, action4) VALUES ('${MainID:escapeSql()}', '${origintimestamp:escapeSql()}', '${Xvalue:escapeSql()}', '${Action1:escapeSql()}', '${Action2:escapeSql()}', '${Action3:escapeSql()}', '${Action4:escapeSql()}');
- 其余参数保持默认即可,表达式中的
:escapeSql()函数会自动转义SQL特殊字符,避免注入风险。
步骤3:执行数据库插入
将ReplaceText的success关系连接到你已经配置好的ExecuteSQL处理器(绑定你提前建好的PG连接池),把ExecuteSQL的SQL select query参数留空,处理器会自动读取流文件内容作为SQL语句执行。
高并发场景可选优化
如果请求并发量较高,可以不用构造单条SQL语句,将提取到的属性转成CSV/JSON格式后,用ConvertRecord + PutDatabaseRecord的组合实现批量插入,性能更高。
内容的提问来源于stack exchange,提问作者Alaa eddean
相关产品推荐
相关产品推荐

