接了一个行内的项目,其中一个步骤是需要使用kettle生成xml文件。
这里我介绍了2种情况:
第一种情况的详细过程:
本人使用的kettle版本为7.1。
下图是要最终生成的测试案例模板
<?xml version="1.0" encoding="UTF-8"?>
<MSG>
<APPTYPE>ACCC</APPTYPE>
<CURRENTFILE>ACCA</CURRENTFILE>
<INOUT>IN</INOUT>
<TOTALRECORDS>1</TOTALRECORDS>
<RECORDS>
<ACTIONTYPE>A</ACTIONTYPE>
<ACTIONDESC/>
<RPTNO>123456</RPTNO>
<CUSTYPE>C</CUSTYPE>
<IDCODE>430515199710222331</IDCODE>
<CUSTCOD>C212</CUSTCOD>
<CUSTNM>张三A</CUSTNM>
<OPPUSER>LISI</OPPUSER>
<TXCCY>CNY</TXCCY>
<TXAMT>200</TXAMT>
<EXRATE> 00000.72000000</EXRATE>
<LCYAMT>100</LCYAMT>
<LCYACC>327342334237</LCYACC>
<FCYAMT>600</FCYAMT>
<FCYACC>USD2131</FCYACC>
<OTHAMT/>
<OTHACC/>
<METHOD>D</METHOD>
<BUSCODE>123123</BUSCODE>
<INCHARGECCY>CNY</INCHARGECCY>
<INCHARGEAMT>20</INCHARGEAMT>
<OUTCHARGECCY/>
<OUTCHARGEAMT/>
</RECORDS>
</MSG>
这是kettle的转换整个过程图
首先把要生成的xml文件拆解,可以分为2部分,上面4个标签的值为固定值,下面标签的值是从数据库取的,所以我们先分别生成,然后再把结果通过XML JOIN组件连接起来再输出。
第一步:添加生成记录组件,并如图配置,根据需要自己增删字段,是否设置默认值
第二步:添加add XML组件,并如图配置,把数据转化为xml格式数据
这里的字段没有把RECORDS加进去,因为第四步的根元素添加了,所以第一步的这个字段可以省略
第三步:添加表输入组件,如图所示,获取表数据
第四步:添加add XML组件,并如图配置,把表数据转换为xml格式数据
第五步:添加XML Join组件,把转换过的2个xml数据连接起来;
这里我指定的连接条件是根元素'//MSG',也可以在第一步的时候多加个'RECORDS',这里的关联条件就可以用'//RECORDS'
第六步:添加文本文件输出组件,字段选择上一步骤的输出结果“VALUE3”,把结果输出为.xml文件
第七步:查看输出结果,正确
第二种情况的详细过程:
第二种情况是需要替换掉多的XML标签;多了个javascript代码组件,其它与第一种情况相同。
总的流程图如图所示:
我们需要的结果如图所示:
<MSG>
<APPTYPE>BOP</APPTYPE>
<CURRENTFILE>BOPT</CURRENTFILE>
<INOUT>IN</INOUT>
<TOTALFILES>10</TOTALFILES>
<FILES>
<FILENAME>BOPA11111111124072401</FILENAME>
<FILENAME>BOPB11111111124072401</FILENAME>
<FILENAME>BOPC11111111124072401</FILENAME>
<FILENAME>BOPD11111111124072401</FILENAME>
<FILENAME>BOPE11111111124072401</FILENAME>
<FILENAME>BOPF11111111124072401</FILENAME>
<FILENAME>JSHD11111111124072401</FILENAME>
<FILENAME>JSHD11111111124072402</FILENAME>
<FILENAME>JSHE11111111124072401</FILENAME>
<FILENAME>JSHE11111111124072402</FILENAME>
</FILES>
</MSG>
但是实际跑出来的数据如图所示:
<MSG>
<APPTYPE>BOP</APPTYPE>
<CURRENTFILE>BOPT</CURRENTFILE>
<INOUT>IN</INOUT>
<TOTALFILES>10</TOTALFILES>
<FILES>
<REC>
<FILENAME>BOPA11111111124072401</FILENAME>
</REC>
<REC>
<FILENAME>BOPB11111111124072401</FILENAME>
</REC>
<REC>
<FILENAME>BOPC11111111124072401</FILENAME>
</REC>
<REC>
<FILENAME>BOPD11111111124072401</FILENAME>
</REC>
<REC>
<FILENAME>BOPE11111111124072401</FILENAME>
</REC>
<REC>
<FILENAME>BOPF11111111124072401</FILENAME>
</REC>
<REC>
<FILENAME>JSHD11111111124072401</FILENAME>
</REC>
<REC>
<FILENAME>JSHD11111111124072402</FILENAME>
</REC>
<REC>
<FILENAME>JSHE11111111124072401</FILENAME>
</REC>
<REC>
<FILENAME>JSHE11111111124072402</FILENAME>
</REC>
</FILES>
</MSG>
这时候我们需要使用JavaScript代码组件,把里面不需要的<REC></REC>标签去掉
如图所示
上图中的代码:
var VALUE4=VALUE3.replace(/<REC>|<\/REC>/g,"");
最后再说一下其它方式也能完成第二种效果,因为其实这些xml文件名除了时间外,其它的地方都是固定的,所以相当于我只要把时间用变量传入,其它的值都是不变的常量,所以对比第二种情况我们只要改下表输入和Add xml就行了
步骤ADD XML 2
生成的.xml文件详情:
<MSG>
<APPTYPE>BOP</APPTYPE>
<CURRENTFILE>BOPT</CURRENTFILE>
<INOUT>IN</INOUT>
<TOTALFILES>10</TOTALFILES>
<FILES>
<FILENAME>BOPA11111111124072401</FILENAME>
<FILENAME>BOPB11111111124072401</FILENAME>
<FILENAME>BOPC11111111124072401</FILENAME>
<FILENAME>BOPD11111111124072401</FILENAME>
<FILENAME>BOPE11111111124072401</FILENAME>
<FILENAME>BOPF11111111124072401</FILENAME>
<FILENAME>JSHD11111111124072401</FILENAME>
<FILENAME>JSHD11111111124072402</FILENAME>
<FILENAME>JSHE11111111124072401</FILENAME>
<FILENAME>JSHE11111111124072402</FILENAME>
</FILES>
</MSG>