Ошибка Dataweave для нулевых узлов

Я сделал кодирование в dataweava как

%dw 1.0
%input payload application/xml
%output application/xml skipNullOn="everywhere"
---
{((payload.*Order default []) map {
Order:{
    Channel:$.@EnterpriseCode,
    Code:$.@OrderNo,
    Status:$.@Status,
    OrderLines: {
    (($.OrderLines.*OrderLine default []) map {
    OrderLine:{
        EntryNumber:"abc",
        Status:$.@Status,

        (($.OrderStatuses.*OrderStatus default []) map {

        ShipDate:$.@StatusDate

        }) 
    }})}
}

}
)
}

Но его ошибка при назначении ввода как

<?xml version="1.0" encoding="UTF-8"?>
<Order EnterpriseCode="111" OrderNo="222" Status="Scheduled">
    <OrderLines>
        <OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000">

        </OrderLine>
    </OrderLines>
</Order>

Любые предложения здесь? Я пробовал default [], но это не работает. При назначении null node выдает ошибку. Я пробовал фильтровать как filter ($ != '')


person Rohan Shinde    schedule 25.11.2015    source источник
comment
Пожалуйста, предоставьте пример входных и выходных данных.   -  person DavoCoder    schedule 25.11.2015
comment
Какую ошибку выдает? Это Cannot coerce a :null to a :array (com.mulesoft.weave.mule.exception.WeaveExecutionException). Message payload is of type: LinkedList?   -  person Möoz    schedule 02.12.2015


Ответы (4)


Пример ввода XML:

<?xml version="1.0" encoding="UTF-8"?>
<Order EnterpriseCode="111" OrderNo="222" Status="Scheduled">
  <OrderLines>
    <OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000">
       <OrderStatuses>
          <OrderStatus StatusDate="statusDate"></OrderStatus>
          <OrderStatus StatusDate="statusDate"></OrderStatus>
      </OrderStatuses>
    </OrderLine>
    <OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine>
  </OrderLines>
</Order>

Примечание. В вашем примере есть пробелы между OrderLine открытым тегом и закрытым тегом, вы должны это исправить:

<OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine>

Сценарий переплетения данных:

%input payload application/xml
%output application/xml skipNullOn="everywhere"
---
{
  ((payload.*Order default []) map {
    Order:{
      Channel:$.@EnterpriseCode,
      Code:$.@OrderNo,
      Status:$.@Status,

      OrderLines: {
        (($.OrderLines.*OrderLine default []) map {

          OrderLine:{
            EntryNumber:"abc",
            Status:$.@Status, 

            (($.OrderStatuses.*OrderStatus default []) map ((key,pos) -> {
                ShipDate:key.@StatusDate
            }) when $!='' otherwise {})

          }

        })
      }


    }
  })
}

Вы не можете сопоставить значение, если оно не существует, поэтому вам нужно использовать «когда/иначе», чтобы проверить существование элементов.

person DavoCoder    schedule 26.11.2015
comment
Привет, Даво, я попробовал этот код, но он все еще выдает ошибку, предоставляя этот ввод <?xml version="1.0" encoding="UTF-8"?> <Order EnterpriseCode="111" OrderNo="222" Status="Scheduled"> <OrderLines> <OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000"> </OrderLine> </OrderLines> </Order> - person Rohan Shinde; 26.11.2015
comment
Хорошо, я создал скрипт с пустой строкой OrderLine следующим образом: ‹OrderLine PrimeLineNo=3 Status=Shipped3 OrderedQty=10003 /› со встроенным закрывающим тегом. - person DavoCoder; 26.11.2015
comment
Есть ли другой вариант ввода, который я предоставил? - person Rohan Shinde; 27.11.2015
comment
Да, это работает. Но опять же, если у кого-то есть другие требования, они будут меняться в соответствии с этим. Спасибо, Даво. - person Rohan Shinde; 01.12.2015
comment
+1 за «Вы не можете сопоставить значение, если оно не существует», если у вас есть опечатка в именах полей, вы получите сообщение об ошибке: Cannot coerce a :null to ... - person mcvkr; 15.09.2017

Попробуйте это. Это должно решить вашу проблему. (Если нет/иначе) или (когда/иначе), любая комбинация может использоваться в соответствии с вашими требованиями. «Если нет» рекомендуется, если ShipDate присутствует в большинстве случаев, в противном случае замените «если нет» на «когда».

%dw 1.0
%input payload application/xml
%output application/xml skipNullOn="everywhere"
---
{
(
    (payload.*Order default []) map {
        Order: {
            Channel:$.@EnterpriseCode,
            Code:$.@OrderNo,
            Status:$.@Status,
            OrderLines: {
                (
                    ($.OrderLines.*OrderLine default []) map ({
                        OrderLine: {
                            EntryNumber:"abc",
                            Status:$.@Status,
                            (
                                ($.OrderStatuses.*OrderStatus) map {
                                    ShipDate:$.@StatusDate
                                }
                            )
                        }
                    }) unless not $.OrderLines.*OrderLine.OrderStatuses? otherwise {
                        OrderLine: {
                            EntryNumber:"abc",
                            Status:$.@Status                                
                        }
                    }
                )
            }
        }
    }
)
}
person J J    schedule 27.11.2015
comment
Привет J J, этот код выглядит хорошо, так как работает для одной итерации <?xml version="1.0" encoding="UTF-8"?> <Order EnterpriseCode="111" OrderNo="222" Status="Scheduled"> <OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000"> </OrderLine> </OrderLines> </Order> Но код не работает для итеративных элементов строки заказа - person Rohan Shinde; 27.11.2015
comment
Это не удается для ввода <?xml version="1.0" encoding="UTF-8"?> <Order EnterpriseCode="111" OrderNo="222" Status="Scheduled"> <OrderLines> <OrderLine PrimeLineNo="1" Status="Released" OrderedQty="70"> <OrderStatuses> <OrderStatus StatusDate="Shipped Date"/> </OrderStatuses> </OrderLine> <OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000"> </OrderLine> </OrderLines> </Order> - person Rohan Shinde; 27.11.2015

Попробуйте следующие подходы:

  • используйте "SkipNullOn" %output application/xml skipNullOn="везде"
  • Вы можете использовать условие when, как показано ниже yourField: «null», когда

payload.yourField == null otherwise payload.yourField

person Rajnish Kumar Jha    schedule 30.01.2018

Приведенное ниже определение структуры объекта Mule Message имеет входящее свойство сообщения исходящее свойство Полезная нагрузка Переменная потока Переменная сеанса Переменная вложения Исключение Полезная нагрузка

Когда коннектор потока (прослушивающий порт) получает полезную нагрузку, его называют конечной точкой входящего трафика. Когда в потоке у нас есть коннектор, помещенный в середину, и мы отправляем полезную нагрузку, называемую исходящей конечной точкой. Здесь все исходящие свойства, отправленные в исходящий поток Http, становятся входящими свойствами в этом потоке.

Подробное объяснение смотрите по ссылке ниже.

https://docs.mulesoft.com/mule-user-guide/v/3.8/mule-message-structure.

person Srinivas    schedule 26.02.2018