于2022年3月8日优化,操作更简单 新文章地址,可互应参考

Kettle 获取WebService数据 解析并存入Oracle数据库

工具

  1. kettle 9.1 (版本影响不大)
  2. oracle11g

官方模板

官方案例:E:\data-integration\samples\transformations   

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_webservice

流程简介

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_webservice_02

  1. 通过 生成记录 生成入参 
  2. 取巧 通过 变量替换 动态替换年月信息
  3. 通过 执行sql脚本 删除数据库的当前年月的数据,然后重新插入数据
  4. Web服务查询 请求WebService
  5. get data fro xml 解析xml 头数据
  6. 我这里因为回参未转义 所以用 JsScript代码 转义。也可以用字符串替换 来替换。或者有更好的方式欢迎留言
  7. get data fro xml 解析xml内容,需要对字段
  8. 表输出

遇到的问题

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回参&lt;<  &gt; > 转义了,导致不能解析

问题:虽然这样解决了 但是还遇到一个问题没解决,就是如果回参的字段里包含'<' '>'   比如:<MC>材料(<100元)</MC> 还是会无法解析,这个和接口商有关 让他们在字段添加 <![CDATA[  材料(<100元)   ]]>,或者直接让他们转义

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_转义_03

解决方式: 这里取巧了,不知道有没有更好地方式。 使用的JsScript代码 进行的转义,或者使用字符串替换 替换掉。

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_转义_04

//Script here
var result = result;
var xmlInfo = result.replace(/</g,"<").replace(/</g,"<").replace(/>/g,">").replace(/
/g,"").replace(/>/g,">");

如果使用字符串替换,替换内容按自己需要修改

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_05

3.动态年月条件

因为项目需要做定时任务,所以需要根据变量进行动态查询。

解决方式:给定一个字符串,使用字符串替换,替换成变量。可以在运行的时候填参数。

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_xml_06

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_转义_07

点击运行后,选择变量,进行填参数

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_08

4. Kettle获取系统时间做动态年月

上边是测试或者手动执行使用,因为要做定时任务,所以需要获取系统时间。

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_09

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_webservice_10

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_11

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_oracle_12

设置成变量以后在运行作业的时候 先运行这个设置变量,把变量存储后 使用变量

配置过程/细节

通过 生成记录 生成入参 

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_13

取巧 通过 变量替换 动态替换年月信息

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_xml_14

通过 执行sql脚本 删除数据库的当前年月的数据,然后重新插入数据

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_oracle_15

Web服务查询 请求WebService

先上一张在页面访问的数据

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_xml_16

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_webservice_17

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_18

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_webservice_19

get data fro xml 解析xml 头数据

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_xml_20

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_21

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_oracle_22

*[name()='ExecQueryResponse']/*[name()='ExecQueryResult']

我这里因为回参未转义 所以用 JsScript代码 转义。也可以用字符串替换 来替换。

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_xml_23

//Script here
var result = result;
var xmlInfo = result.replace(/</g,"<").replace(/</g,"<").replace(/>/g,">").replace(/
/g,"").replace(/>/g,">");

get data fro xml 解析xml内容,需要对字段

因为上一步传的值 是 xmlInfo

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_24

第二层解析

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_xml_25

对回参数据:名称和XML路径 是一样 直接填回参的字段就可以

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_webservice_26

表输出

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_27

KETTLE 监控目录下的文件XML文件并且有新的内容要更新 kettle解析xml数据_etl_28

完活收工,如果有更好的方法可以留言一起分享学习