【问题标题】:Other ways to add default namespaces in Dataweave 2.0?在 Dataweave 2.0 中添加默认命名空间的其他方法?
【发布时间】:2021-07-22 18:38:58
【问题描述】:

我最近通过咨询doc page 了解了如何在 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 类型的任何文档?我找不到。

【问题讨论】:

    标签: dataweave


    【解决方案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 对象。除此之外,我还没有看到围绕它的其他实际用例或与之交互的有用方法。看到有人发布其他更有用的东西会很有趣,但我得到的就是这些。

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多