Массив для плоского отображения в Муле на основе условия
Я пытаюсь отобразить ответ от стороннего звонка в другую структуру, используя преобразование DataMapper в Mule.
От третьего лица мы получаем массив элементов (среди прочего), и я хочу сопоставить один элемент в массиве с объектом (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"
}
]
}
}
Идентификатор выбранной книги хранится в inputArgument.bookId
,
Я могу завершить сопоставление, используя правило xpath для каждого из полей, однако мне нужно жестко закодировать bookId в xpath. Вместо этого мне нужно иметь возможность заменить действительный идентификатор на предоставленный (и доступный в inputArgument).
xpath для заголовка
/account/books/book[child::id=1]/title
Я попытался добавить MEL для замены идентификатора и различных других исправлений, но, похоже, ничего не работает. Есть ли способ заменить поле bookId.
Примечание. Из-за ограничений клиента я не могу использовать DataWeave.
3 ответа
Используя 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>
Вы должны использовать операцию 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
}
}) }
}
})
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"/>