在Terraform中对XML进行编码

编程语言 2026-07-08

在Terraform中像这样构建一个XML字符串

<set-header name="ApiKey" exists-action="override"> 
    <value>${var.my_key}</value> 
</set-header>

我得到的最终文本不正确,因为 var.my_key 包含保留的XML字符。如何对这个变量进行编码?

解决方案

另一个答案只是用一大堆嵌套的 replace 调用,可能是这个问题最实用/务实的答案,但以防万一,如果你感兴趣,这里有一个更完整的示例,展示了如何使用Terraform的 regexall 函数对输入进行分词,然后逐个标记地进行变换,而不是对每个需要转义的字符进行逐字重新处理整个字符串:

locals {
  input = "<hello & goodbye>"
  replacements = {
    "<" = "&lt;"
    ">" = "&gt;"
    "&" = "&amp;"
  }
  tokens = regexall("[^<>&]+|.", local.input)
  replaced = [
    for tok in local.tokens : lookup(local.replacements, tok, tok)
  ]
}

output "result" {
  value = join("", local.replaced)
}

tokens 表达式将单独的XML特殊字符从任意其他字符序列中分离,因此对于上面所示的输入,会生成如下列表:

["<", "hello ", "&", " goodbye", ">"]

(你可以在regex101.com上对这个正则表达式进行更多尝试,链接在此:regex101.com。)

现在这个列表包含两类不同的标记:一类是匹配 local.replacements 的键的,另一类不是。replaced 表达式随后将每一个与替换映射中的键匹配的项替换为该映射中对应的值,生成如下内容:

["&lt;", "hello ", "&amp;", " goodbye", "&gt;"]

然后输出值表达式只是把这些块重新拼接起来,得到结果 &lt;hello &amp; goodbye&gt;

对于相对较大的字符串来说,没有理由偏好这种形式而不是嵌套的 replace 调用,但像这样进行分词在你的Terraform模式工具箱中可能会派上用场,适用于涉及字符串处理的更复杂情形,例如动态模板替换。

不过要说清楚:在这种情况下,我仍然建议使用另一个带有嵌套 replace 调用的解决方案,因为它更简洁,也更易于理解。 😀

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章