根据子项拆分 XML 并迭代动态标签
Split XML based on a child and iterate over a dynamic tag
在我的 Mule 流程中,我将调用一个存储过程,它会输出我 XML 类似这样的响应
<RESULT xmlns="some_stored_proc:Response">
<ROOT_TAG>
<RESULTSET_1>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>1</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>1</hasError>
</ROW>
</RESULTSET_1>
<RESULTSET_2>
<ROW>
<A>0.3</A>
<B>0.2</B>
<C>1.1</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>0</hasError>
</ROW>
</RESULTSET_2>
<RESULTSET_3>
<ROW>
<A>1.1</A>
<B>2.4</B>
<C>1.8</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>0</hasError>
</ROW>
</RESULTSET_3>
</ROOT_TAG>
</RESULT>
现在在我的 dataweave 中,我想做的是通过这个 XML 并将任何设置为 1 的内容带到名为 ISSUES
的根标签下
<ISSUES>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>1</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>1</hasError>
</ROW>
</ISSUES>
其余的 ROW 像这样放在 DOCUMENT 下
<DOCUMENT>
<ROW>
<A>0.3</A>
<B>0.2</B>
<C>1.1</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>1.1</A>
<B>2.4</B>
<C>1.8</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>0</hasError>
</ROW>
</DOCUMENT>
我一直遇到一个异常。
注意: 根据输入大小和作为数据库存储过程输入的组大小,可以有任意数量的 <RESULTSET_n>
标签。所以这个标签将是动态的。
基本上我所做的就是使用 groupBy 函数将您的文档拆分为有效和无效,我将每个部分转换为预期的数据结构
%dw 2.0
output application/xml
import * from dw::core::Objects
---
{
RESULT: {(
payload.RESULT.ROOT_TAG
groupBy ((value, key) -> (key as String match /RESULTSET_([0-9]+)/)[1] == "1")
pluck ((value, key, index) ->
key as String match {
case "true" ->
{ ISSUES: {(valueSet(value))}}
case "false" ->
{ DOCUMENT: {(valueSet(value))}}
}
)
)}
}
在我的 Mule 流程中,我将调用一个存储过程,它会输出我 XML 类似这样的响应
<RESULT xmlns="some_stored_proc:Response">
<ROOT_TAG>
<RESULTSET_1>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>1</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>1</hasError>
</ROW>
</RESULTSET_1>
<RESULTSET_2>
<ROW>
<A>0.3</A>
<B>0.2</B>
<C>1.1</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>0</hasError>
</ROW>
</RESULTSET_2>
<RESULTSET_3>
<ROW>
<A>1.1</A>
<B>2.4</B>
<C>1.8</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>0</hasError>
</ROW>
</RESULTSET_3>
</ROOT_TAG>
</RESULT>
现在在我的 dataweave 中,我想做的是通过这个 XML 并将任何设置为 1 的内容带到名为 ISSUES
的根标签下<ISSUES>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>1</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>1</hasError>
</ROW>
</ISSUES>
其余的 ROW 像这样放在 DOCUMENT 下
<DOCUMENT>
<ROW>
<A>0.3</A>
<B>0.2</B>
<C>1.1</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>1.1</A>
<B>2.4</B>
<C>1.8</C>
<hasError>0</hasError>
</ROW>
<ROW>
<A>0.1</A>
<B>0.4</B>
<C>1.0</C>
<hasError>0</hasError>
</ROW>
</DOCUMENT>
我一直遇到一个异常。
注意: 根据输入大小和作为数据库存储过程输入的组大小,可以有任意数量的 <RESULTSET_n>
标签。所以这个标签将是动态的。
基本上我所做的就是使用 groupBy 函数将您的文档拆分为有效和无效,我将每个部分转换为预期的数据结构
%dw 2.0
output application/xml
import * from dw::core::Objects
---
{
RESULT: {(
payload.RESULT.ROOT_TAG
groupBy ((value, key) -> (key as String match /RESULTSET_([0-9]+)/)[1] == "1")
pluck ((value, key, index) ->
key as String match {
case "true" ->
{ ISSUES: {(valueSet(value))}}
case "false" ->
{ DOCUMENT: {(valueSet(value))}}
}
)
)}
}