WSO2:使用Payload Factory将JSON/XML转为制表符CSV并换行写入
解决Iterate循环生成多行CSV的问题
核心思路
每次迭代生成带换行符的单行数据,再通过属性累加或聚合拼接所有行,最终输出完整的多行CSV。
步骤1:在Payload Factory中生成带换行的单行数据
在Payload Factory里,为每条生成的记录末尾添加换行符(XML中用 表示),制表符用	表示。示例配置:
<payloadFactory media-type="text"> <format>$1	$2	$3 </format> <args> <arg evaluator="json" expression="$.id"/> <arg evaluator="json" expression="$.name"/> <arg evaluator="json" expression="$.email"/> </args> </payloadFactory>
这样每次迭代输出的都是字段1\t字段2\t字段3\n格式的单行字符串。
步骤2:用属性累加所有行数据
- 先初始化一个空属性存储CSV内容:
<property name="csvContent" scope="default" type="STRING" value=""/>
- 在Iterate循环内部,用Script中介(JavaScript)将当前行追加到属性中:
<script language="js"><![CDATA[ // 获取当前迭代生成的单行数据 var currentLine = mc.getPayload(); // 获取已有的CSV内容 var existingContent = mc.getProperty("csvContent"); // 追加新行并更新属性 mc.setProperty("csvContent", existingContent + currentLine); ]]></script>
- Iterate配置需设置
preservePayload="false",确保每次迭代的payload是当前生成的行数据。
步骤3:输出最终CSV内容
Iterate循环结束后,将累加好的属性值设为最终payload,再写入文件:
<payloadFactory media-type="text"> <format>$1</format> <args> <arg evaluator="xml" expression="$ctx:csvContent"/> </args> </payloadFactory> <!-- 后续添加文件写入逻辑,如VFS中介 -->
可选:去除末尾多余换行符
如果担心最后一行多一个换行,可在输出前用Script处理:
<script language="js"><![CDATA[ var csv = mc.getProperty("csvContent"); if (csv && csv.endsWith("\n")) { csv = csv.substring(0, csv.length - 1); mc.setProperty("csvContent", csv); } ]]></script>
内容的提问来源于stack exchange,提问作者ahinsa
相关产品推荐
相关产品推荐

