基于条件的Mule中的数组到平面映射

时间:2016-03-21 23:01:51

标签: xpath mule mule-el

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

从第三方开始,我们收到了一系列项目(以及其他内容),我想将数组中的单个项目映射到一个对象(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替换为所提供的id(并且在inputArgument中可用)。

标题的xpath

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

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

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

3 个答案:

答案 0 :(得分:0)

使用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>

答案 1 :(得分:-1)

您应该使用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
        }
      }) }
    }
})

答案 2 :(得分:-1)

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"/>