如何替换 XML 的子节点名称

How to replace child node names of an XML

我正在尝试将 XML 文档中的子节点名称“Layer01”、“Layer02”、“Layer03”等替换为“Layer”。

在 Mule 3 中我使用了:

payload.replaceAll('Layer\d\d','Layer')

逻辑是替换以字符串"Layer"开头的子节点。

示例输入:

<Layers>
    <Layer01>
    ............
    ............
    </Layer01>
    <Layer30>
    ............
    ............
    </Layer30>
    ....
    ....
</Layers>

预期输出:

<Layers>
    <Layer>
    ............
    ............
    </Layer>
    <Layer>
    ............
    ............
    </Layer>
    ....
    ....
</Layers>

如何在 Mule 4 中实现此转换?

完整输入负载:https://github.com/Manikandan99/Map_request/blob/main/input_rating.xml

完整的预期输出:https://github.com/Manikandan99/Map_request/blob/main/output_rating.xml

您可以使用递归函数来获得相同的结果。测试每个键以查看它是否与模式匹配,然后替换它,否则保持原样。以递归方式将函数应用于每个值,以防子元素需要转换。

%dw 2.0
output application/xml
fun renameLayers(x) =
    x match {
        case is Object -> 
            x mapObject ((value, key, index) -> (key as String replace /^Layer\d\d/ with "Layer"): renameLayers(value)) 
        else -> x
  }
---
renameLayers(payload)

输入:

<Layers>
    <Layer01>
        <Layer02>
        </Layer02>
    </Layer01>
    <Layer30>
        <Other>
        </Other>
    </Layer30>
</Layers>

输出:

<?xml version='1.0' encoding='UTF-8'?>
<Layer>
  <Layer>
    <Layer/>
  </Layer>
  <Layer>
    <Other/>
  </Layer>
</Layer>