kettle中的xml文件输出组件的功能其实是很弱的,所以要生成较为复杂的xml文件时需要使用组件:
add xml,
使用merge join主要是为了减少在xml join中需要匹配的结果集合(因为xml join中的匹配功能其实是很弱的)。
在merge join之前记录必须先排序。
placeholder 组件是往记录流中添加一个常量,这个常量在 add xml中通常不被设为属性,而是在xml join中用于放置需要被组装进去的xml元素。
以生成如下简单的xml文件为例:
<?xml version="1.0" encoding="UTF-8"?>
<document>
<p>
Hello from section foo
</p>
</section>
<section name="bar">
Hello from section bar
</document>
对应的kettle 转换为:
首先需要从excel文件中读取数据,excel文件中的内容为
利用读取到的内容生成xml元素,如下是add xml中的设置:
这一步主要生成了如下的xml元素:
接下来要生成 <document>元素,因为该元素没有对应的数据,所以使用“生成记录”组件生成一条空记录用于与之前的xml元素进行xml join。它的功能有点类似与之前提到的placeholder,不同的是这个可以作为起始输入,而placeholder是一个转换步骤。
接着就是进行xml join了,source stream中的xml元素会被拼接到target stream的xml元素中。怎么拼接有join condition properties决定,它是使用xpath来定位要拼接的位置,例如//doc 就是把source stream的元素拼接到每个doc元素中。需要注意的是,由于这次xml join之后xml文件就生成好了,所以不能把omit xml header选上。
当然通过xpath也可以做复杂的条件join,如下是个例子:
可以通过xpath指定在所有target stream的area元素中如果area的属性STATIONID的值与source stream中STATIONID的值(这个值不一定要在source的xml元素中,但必须在source stream中,例如可以是一开始从excel读入的流中)相同,那么把source stream中的xml元素放到 orderlinecomments元素中。
这步之后生成的xml文件如下:
<doc>
</doc>
和我们预期的多了<doc>和</doc>,这是我们使用js脚本进行替换:
js脚本处理好之后,输出流的名字就换成 xmlOderLinesNew了。
最后把这个流输出到文件中,需要注意的是在内容中不要使用“分割符”,“封闭符”,和“头部”: