2016-03-21 15 views
5

Mule内のDataMapperトランスフォームを使用して、第三者呼び出しからの応答を別の構造にマップしようとしています。条件に基づくMuleのフラットマッピングへの配列

第三者からは(とりわけ)一連のアイテムがあり、配列内の1つのアイテムをオブジェクト(JSON)にマッピングしたいと考えています。入力引数として利用可能なリクエスト内の項目の識別子を受け取ります。

私の質問は、識別子に基づいてアイテムのフィールドをどのようにマッピングできますか?

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

例XML応答がなる必要があります:

{ 
    "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をハードコードする必要があります。代わりに、私は、提供されている(そしてinputArgumentで利用可能な)実際のIDを代用できる必要があります。タイトル

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

ため

のXPath私はidと他のさまざまな修正を置き換えるためにMELを追加しようとしたが、何も動作していないようにみえます。 bookIdフィールドを代用する方法はありますか?

注:クライアントの制限により、私はDataWeaveを使用できません。

+0

あなたは/アカウント/書籍/ブックにするために、各試すことができますが、このような何かを行うことができます。各ペイロードに対して、各パラメータの値を取得します。 jsonはPOJOを作成してから、それぞれのペイロードからマッピングを実行した後にオブジェクトをjsonトランスフォーマに変換するだけです。 –

+0

ありがとうラルフ。私は、「各パラメータの価値を知る」ということについて少しは理解していませんでした。もう少し情報を提供できますか? – user2294382

+0

foreachを使って/ account/books/iterateに進むと、各書籍アイテムを取得できます。 foreachの中でjsonに変換して#[payload.id]、#[payload.title]のようなことをすることができます –

答えて

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> 
+0

これはDataWeaveの権利ですか?データマッパーではない – user2294382

-1

[グループ化]操作を使用して、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 
     } 
     }) } 
    } 
}) 
関連する問題