2016-09-29 1 views
1

Я использую Dataweave переформатировать XML с полезной нагрузкой в ​​формат программа ожидает:Преобразование XML-XML в формате Dataweave «Невозможно принудить массив: a к строке:».

Payload

<reservation> 
    <id>1</id> 
    <begin_time>12:00 PM</begin_time> 
    <end_time>1:00 PM</begin_time> 
    <other_field>Misc. Data</other_field> 
</reservation> 
. 
. 
. 

Ожидаемый результат.

<reservation> 
    <id>1</id> 
    <begin_time>12:00 PM</begin_time> 
    <schedule> 
     <begin_time>12:00 PM</begin_time> 
     <end_time>1:00 PM</end_time> 
    </schedule> 
</reservation> 
. 
. 
. 

Dataweave Код

%dw 1.0 
%output application/xml 
%namespace ns0 http://www.collegenet.com/r25 
--- 
using (r = (flatten payload.ns0#reservations.*ns0#reservation)) 

    Reservation: r groupBy $.ns0#reservation_id pluck { 
     id : $.ns0#reservation_id , 
     StartTime: $.ns0#reservation_start_dt, 
     Schedule : { 
      ReservationStartDate : $.ns0#reservation_start_dt, 
      PreEventDate : $.ns0#pre_event_dt, 
      EventStartDate : $.ns0#event_start_dt, 
      PostEventDate : $.ns0#post_event_dt, 
      ReservationEndDate : $.ns0#reservation_end_dt 
     } 
    } 

Всякий раз, когда я пытаюсь этот код, я получаю сообщение об ошибке:

"Exception while executing: Reservation: r map { ^ Cannot coerce a :array to a :object."

Когда я пытаюсь точно такой же код, но преобразование в JSON вместо XML, преобразование работы в совершенстве. Если я удалю карту, код работает, но он объединяет все идентификаторы для всех оговорок под одним и тем же заголовком. Я не понимаю, почему Anypoint интерпретирует xml как массив, а не объекты.

ответ

0

Первое, что вам нужно позаботиться - всякий раз, когда вы перебираете карту, вам нужно получить доступ к данным текущего элемента с помощью $ и указать индекс $$. Здесь r.ns0#reservation_id пытается принудить к: объекту from: array. Попробуйте изменить код как

%dw 1.0 
%output text/xml 
%namespace ns0 http://www.mynamespace.com/ns0 
--- 
using (r = (flatten payload.ns0#reservations.*ns0#reservation)) 

Reservation: r map { 
    id : $.ns0#reservation_id, 
    StartTime: $.ns0#reservation_start_dt, 
    Schedule : { 
     ReservationStartDate : $.ns0#reservation_start_dt, 
     ReservationEndDate : $.ns0#reservation_end_dt 
    } 
} 

Также отмечено, что входные XML имеют разные имена тегов, чем имена, используемые в коде. Для большей читаемости вы можете использовать лямбда с картой

%dw 1.0 
%output text/xml 
%namespace ns0 http://www.mynamespace.com/ns0 
--- 
using (r = (flatten payload.ns0#reservations.*ns0#reservation)) 

Reservation: r map ((reservation, reservationIndex) -> { 
    id : reservation.ns0#reservation_id, 
    StartTime: reservation.ns0#reservation_start_dt, 
    Schedule : { 
     ReservationStartDate : reservation.ns0#reservation_start_dt, 
     ReservationEndDate : reservation.ns0#reservation_end_dt 
    } 
}) 

Надеюсь, это поможет.

+0

Когда я попробовал, что я получил ошибку «Исключение при выполнении: с использованием (г = (расплющить payload.ns0 # оговорки * ns0 # заказа).) ^ Тип рассогласования для„придавить“оператора найдено: нулевой required: array. " Я думаю, вы нашли другие ошибки в моем коде, код в исходном сообщении был переработан, чтобы исправить это, но основная ошибка все еще существует. –

+0

Я могу помочь больше, если вы можете по крайней мере опубликовать правильный входной формат XML и выходной формат. – AnupamBhusari