于2022年3月8日优化,操作更简单 新文章地址,可互应参考
Kettle 获取WebService数据 解析并存入Oracle数据库
工具
- kettle 9.1 (版本影响不大)
- oracle11g
官方模板
官方案例:E:\data-integration\samples\transformations
流程简介
- 通过 生成记录 生成入参
- 取巧 通过 变量替换 动态替换年月信息
- 通过 执行sql脚本 删除数据库的当前年月的数据,然后重新插入数据
- Web服务查询 请求WebService
- get data fro xml 解析xml 头数据
- 我这里因为回参未转义 所以用 JsScript代码 转义。也可以用字符串替换 来替换。或者有更好的方式欢迎留言
- get data fro xml 解析xml内容,需要对字段
- 表输出
遇到的问题
1. java.lang.IllegalArgumentException: Entity may not be null
对方提供的入参是 <ROOT><ND>2021</ND><YD>03</YD></ROOT>,然后就一直报错,他们也能查出来。就我查不出,可纳闷。
解决方式:在入参的时候 再包一层 <![CDATA[ 你的入参 ]]>
<![CDATA[<ROOT><ND>2021</ND><YD>03</YD></ROOT>]]>
2.kettle回参<;< > > 转义了,导致不能解析
问题:虽然这样解决了 但是还遇到一个问题没解决,就是如果回参的字段里包含'<' '>' 比如:<MC>材料(<100元)</MC> 还是会无法解析,这个和接口商有关 让他们在字段添加 <![CDATA[ 材料(<100元) ]]>,或者直接让他们转义
解决方式: 这里取巧了,不知道有没有更好地方式。 使用的JsScript代码 进行的转义,或者使用字符串替换 替换掉。
//Script here
var result = result;
var xmlInfo = result.replace(/</g,"<").replace(/</g,"<").replace(/>/g,">").replace(/
/g,"").replace(/>/g,">");
如果使用字符串替换,替换内容按自己需要修改
3.动态年月条件
因为项目需要做定时任务,所以需要根据变量进行动态查询。
解决方式:给定一个字符串,使用字符串替换,替换成变量。可以在运行的时候填参数。
点击运行后,选择变量,进行填参数
4. Kettle获取系统时间做动态年月
上边是测试或者手动执行使用,因为要做定时任务,所以需要获取系统时间。
设置成变量以后在运行作业的时候 先运行这个设置变量,把变量存储后 使用变量
配置过程/细节
通过 生成记录 生成入参
取巧 通过 变量替换 动态替换年月信息
通过 执行sql脚本 删除数据库的当前年月的数据,然后重新插入数据
Web服务查询 请求WebService
先上一张在页面访问的数据
get data fro xml 解析xml 头数据
*[name()='ExecQueryResponse']/*[name()='ExecQueryResult']
我这里因为回参未转义 所以用 JsScript代码 转义。也可以用字符串替换 来替换。
//Script here
var result = result;
var xmlInfo = result.replace(/</g,"<").replace(/</g,"<").replace(/>/g,">").replace(/
/g,"").replace(/>/g,">");
get data fro xml 解析xml内容,需要对字段
因为上一步传的值 是 xmlInfo
第二层解析
对回参数据:名称和XML路径 是一样 直接填回参的字段就可以
表输出
完活收工,如果有更好的方法可以留言一起分享学习