dataweave 中转义的 Xml 特殊字符

问题描述 投票:0回答:1

我有一个 json 有效负载,其中包含一些 ascii 字符,如下所示。

Blades with \u000BMahogony/ Natural Wood Fin

我们需要将上述数据以XML形式传递给下游系统。我正在尝试使用

output application/xml escapeGT=true

它在 dataweave playground 中工作,就像在任何工作室中一样,它给出错误提示

escapeGT is not valid. Valid options are...

需要知道可以使用哪个函数,让mule可以在不修改接收到的数据的情况下将数据发送到下游系统。

Mule运行时版本:4.3.0EE XML代码:

%dw 2.0
var batchSize = p('product.batchSize')
var mapPayload = if (batchSize == '1') [payload] else payload
output application/xml escapeGT=true
---
ItemList: {( mapPayload map {
    Item @(
       ItemID: $.ItemID,
       SyncTS: vars.timeStamp....
xml dataweave mulesoft mule4
1个回答
0
投票

escapeGT writer 属性仅在 Mule 4.4 或更高版本的 DataWeave 2.4 中可用。 previous version 的文档显示它不存在。即使您升级了,也不清楚为什么这个选项适用于这种情况。该选项不适用于此类字符。在我看来,它似乎是一种未记录的用法,可以在未来的版本中删除或修复。

您尝试写入的字符在 XML 1.1 中无效。 DataWeave 因尝试写入无效字符而抛出错误。

一个选项是通过用空字符串替换它来删除字符,或者用普通的空白字符替换它。您丢失了字符,但输出将是有效的 XML。

%dw 2.0
output application/xml
import * from dw::core::Strings
---
{ 
    x: replaceAll(payload.description, "\u000B", "") 
}

如果您希望保留字符数,可以将其替换为普通空格字符:

replaceAll(payload.description, "\u000B", " ") 

另一种可能性是对字符进行编码,以便 XML 解析器可以接受它:

%dw 2.0
output application/xml
import * from dw::core::Strings
---
{ 
    x: replaceAll(payload.description, "\u000B", "") 
}

这个解决方案的优点是它适用于 DataWeave 编写它,如果你想将它用作另一个 DataWeave 脚本的输入。话虽如此,它似乎并没有重新生成原始角色,所以它并不完美。实际识别如此编码的字符的第三方解析器可能仍然会失败。

不推荐将输出值设置为 CDATA。它可以防止错误发生,但输出仍然无效,并且将作为 DataWeave 的输入失败。

© www.soinside.com 2019 - 2024. All rights reserved.