【问题标题】:Array to flat mapping in Mule based on conditionMule中基于条件的数组到平面映射
【发布时间】:2018-09-05 17:57:29
【问题描述】:

我正在尝试使用 Mule 中的 DataMapper 转换将来自第 3 方调用的响应映射到不同的结构中。

我们从第 3 方收到一个项目数组(除其他外),我想将数组中的单个项目映射到一个对象 (JSON)。我收到请求中项目的标识符,可用作输入参数。

我的问题是,如何根据标识符映射项目的字段?

示例 XML 响应

<account>
    <accountNumber>1234567</accountNumber>
    <books>
        <book>
            <id>1</id>
            <title>Sample title1</title>
            <availableFrom>21-03-16</availableFrom>
        </book>
        <book>
            <id>2</id>
            <title>Sample title2</title>
            <availableFrom>21-03-16</availableFrom>
        </book>
        <book>
            <id>3</id>
            <title>Sample title3</title>
            <availableFrom>21-03-16</availableFrom>
        </book>
    </books>
</account>

需要成为:

{
    "person": {
        "accountNumber": 1234567,
        "selectedBook": {
            "id": 1, 
            "title": "Sample title1"
        },
        "otherBooks": [
            {
                "id": 2, 
                "title": "Sample title2"
            },
            {
                "id": 3, 
                "title": "Sample title3"
            }
        ]
    }
}

所选图书的 ID 保存在 inputArgument.bookId 中。

我可以为每个字段使用 xpath 规则完成映射,但是,我必须在 xpath 中硬编码 bookId。相反,我需要能够将实际 id 替换为提供的(并且在 inputArgument 中可用)。

标题的xpath

/account/books/book[child::id=1]/title

我尝试添加 MEL 来替换 id 和其他各种修复,但似乎没有任何效果。有没有办法替换 bookId 字段。

注意:由于客户端限制,我无法使用DataWeave。

【问题讨论】:

  • 你可以尝试为每个到 /account/books/book。然后为每个有效载荷获取每个参数的值。 json 很简单,只需创建一个 POJO,然后在从 for-each 有效负载进行映射后将对象转换为 json 转换器。
  • 谢谢拉尔夫。我不太了解“获取每个参数的值” - 你能提供更多信息吗?
  • 我的意思是当您使用 foreach 迭代到 /account/books/ 时,您可以获得每本书。在 foreach 中,您可以转换为 json,然后执行 #[payload.id]、#[payload.title] 之类的操作

标签: xpath mule mule-el


【解决方案1】:

使用 dataweave,你可以做这样的事情。

<dw:transform-message metadata:id="0ce877a9-29ed-401b-bd54-b90d42a1609f" doc:name="Transform Message">
                <dw:set-payload><![CDATA[%dw 1.0
    %var bookId = "1"
    %var account = payload.account
    %var books = payload.account.books
    %output application/json
    ---
    {
        person : {
            accountNumber: account.accountNumber,
            selectedBooks: (books.*book map {
                id : $.id,
                title: $.title
            } filter $.id == bookId)[0],
            otherBooks: books.*book map {
                id : $.id,
                title: $.title
            } filter $.id != bookId
        }
    }]]></dw:set-payload>
            </dw:transform-message>

【讨论】:

    【解决方案2】:

    您应该使用 Group By 操作将您的 XML 文件转换为所需的 JSON 格式。你可以这样做:

    DataWeave 转换示例:

    %dw 1.0
    %output application/dw
    ---
    classrooms: payload.school.teachers groupBy $.subject mapObject ((teacherGroup, subject) -> {
        class: {
          name: subject,
          teachers: { (teacherGroup map {
            teacher:{
                name: $.name,
                lastName: $.lastName
            }
          }) },
          attendees: { (payload.school.students filter ($.*hobby contains subject) map {
            attendee: {
              name: $.name,
              lastName: $.lastName
            }
          }) }
        }
    })
    

    【讨论】:

      【解决方案3】:
      In Case of Mule in case of single XML element convert to Array 
      
      xml files : 
      
      <usrId>10120</usrId>
      
      IN Rule file use double dot($..usrId) instead ofsinfle ($.usrId) it will revert array element for single element.
      
      RULE FILE:
      <parameter parameter_name_client="$..usrId"
      parameter_name_server="facture_ids" format_required="false"
      data_type="Array" value_change_required="false"
      is_TLV="false" is_mandatory="false" to_be_logged="false"/>
      

      【讨论】:

      • 您确定您的回答与问题有关吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2021-07-09
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多