#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
объект для этого ключа. Кроме этого, я не видел других реальных вариантов использования или полезных способов взаимодействия с ним. Было бы интересно посмотреть, как кто-нибудь опубликует что-нибудь еще с большей пользой, но это все, что у меня есть.