在 Mule 4 中如何将 SQL Server SELECT 转换为 XML?

Ste*_*eve 1 xml sql-server mule dataweave mulesoft

如何使用 Mule 4 中的 Dataweave 将以下 SQL 输出转换为 XML?

SELECT s.RefId
          ,s.LocalId
          ,s.StateProvinceId
          ,s.SchoolName
          ,e.Email
          ,e.EmailType
      FROM SchoolInfo s
      LEFT OUTER JOIN SchoolEmail e
      ON    e.SchoolRefId = s.RefId
      WHERE s.RefId = :ref_id
Run Code Online (Sandbox Code Playgroud)

SQL中的输出是:

RefId                               LocalId StateProvinceId SchoolName      Email               Type
7FDF722B-6BBA-4BF0-8205-A5380B269EF1    1   SA              Steve's School  steven@gmail.com    prm
7FDF722B-6BBA-4BF0-8205-A5380B269EF1    1   SA              Steve's School  test@gmail.com      sec
Run Code Online (Sandbox Code Playgroud)

XML 输出应如下所示:

<ns0:SchoolInfo xmlns:ns0="http://www.sifassociation.org/datamodel/au/3.4" RefId="7FDF722B-6BBA-4BF0-8205-A5380B269EF1">
  <ns0:LocalId>1</ns0:LocalId>
  <ns0:StateProvinceId>SA</ns0:StateProvinceId>
  <ns0:SchoolName>Steve's School</ns0:SchoolName>
  <ns0:SchoolEmailList>
    <ns0:Email Type="prm">steven@gmail.com</ns0:Email>
    <ns0:Email Type="sec">test@gmail.com</ns0:Email>
  </ns0:SchoolEmailList>
</ns0:SchoolInfo>
Run Code Online (Sandbox Code Playgroud)

谢谢,史蒂夫

Geo*_*rge 5

这是将生成相同 XML 的 DW 表达式:

%dw 2.0
output application/xml
ns ns0 http://www.sifassociation.org/datamodel/au/3.4
var rId = payload[0].RefId
var lId = payload[0].LocalId
var sId = payload[0].StateProvinceId
---
ns0#SchoolInfo @(RefId: rId): {
    ns0#LocalId: lId,
    ns0#StateProvinceId: sId,
    ns0#SchoolEmailList: payload reduce (e,acc={}) -> acc ++ {
        ns0#Email @(Type: e.Type): e.Email
    }   
} 
Run Code Online (Sandbox Code Playgroud)

我假设RefId, LocalId, 和StateProvinceId每个查询总是相同的。

说明reducereduce说明这里有其理论基础沿细节。这里还有reduceMuleSoft 文档页面。最后一页很好地解释了reduce

现在用我自己的话来说,reduce将 (1) 数组和 (2) lambda 函数作为输入。

该数组包含的元素reduce将以与map函数类似的方式迭代。mapreduce函数之间的相似之处到此结束:)。

lambda 函数需要两个参数:(1) 从数组中迭代的当前元素和 (2) 累加器。累加器可以初始化为一个值(我{}在您的用例中将它设置为一个对象,因为 XML 不喜欢数组)。此 FIRST 迭代的 lambda 函数的结果被设置为下一次迭代的累加器,依此类推。

reduce一旦完成对数组的迭代,结果就是累加器。

因此,如果我要跟踪这个特定的内容reduce,它将看起来像这样,并且我简化了这些值的表示:

/*
 * 1st iteration: (e=steven@gmail.com, acc={}) -> acc + {Email: steven@gmail.com}
 * 2nd iteration: (e=test@gmail.com, acc={Email: steven@gmail.com} -> acc + {Email: test@gmail.com}
 * result: acc = {Email: steven@gmail.com, Email: test@gmail.com}
 */
Run Code Online (Sandbox Code Playgroud)