Другие способы добавления пространств имен по умолчанию в Dataweave 2.0?

#dataweave

Вопрос:

Недавно я выяснил, как добавить пространства имен по умолчанию в XML, обратившись к этой странице документа.

 %dw 2.0
output application/xml
var dns = {uri: "http://api.acme.com/customer", prefix: ""} as Namespace
---
dns#customer: {
    dns#name: "Max",
    dns#city: "LA"
}
 

Который генерирует следующий xml:

 <?xml version='1.0' encoding='UTF-8'?>
<customer xmlns="http://api.acme.com/customer">
  <name>Max</name>
  <city>LA</city>
</customer>
 

Существует ли какой-либо другой способ использования ns декларации? Есть какая-нибудь документация по Namespace типу? Я не могу найти ни одного.

Ответ №1:

Это довольно простой тип, вероятно, определяемый примерно так:

 %dw 2.0
type Namespace = {
   URI: String,
   prefix: String
}
 

Он Namespace действительно используется только с XML и содержит довольно базовую информацию. У меня есть несколько «рецептов», которые я использую, например, что-то, что рекурсивно добавляет пространства имен:

 %dw 2.0

fun appendNamespace(data, nsSelector: (k: Key) -> Namespace | Null) =
  data match {
    case is Array -> data map appendNamespace($, nsSelector)
    case is Object -> data mapObject do {
      var ns0 = nsSelector($)
      ---
      if (ns0 != null) ns0#"$($)": appendNamespace($, nsSelector)
      else ($): appendNamespace($, nsSelector)
    }
    else -> data
}
 

Используется так:

 %dw 2.0

ns soapenv http://schemas.xmlsoap.org/soap/envelope/
ns tem http://tempuri.org/

output application/xml
---
{
    soapenv#Envelope: {
        soapenv#Header: null,
        soapenv#Body: payload appendNamespace tem
    }
}
 

И, конечно, есть селектор пространства имен ( payload.someKey.# ), который возвращает Namespace объект для этого ключа. Кроме этого, я не видел других реальных вариантов использования или полезных способов взаимодействия с ним. Было бы интересно посмотреть, как кто-нибудь опубликует что-нибудь еще с большей пользой, но это все, что у меня есть.