使用 Nokogiri 构建 XML 文档时如何用破折号替换下划线?

How to replace underscore with dashes when building XML document with Nokogiri?

我正在使用以下代码构建一个新的 XML 文档:

doc = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do
  reginfo {
    client_type_id client_type == :associate ? ASSOCIATE : CLIENT 
    parent_ {
      id_ client_type == :associate ? associate_id : customer_id
      client_type_id client_type == :associate ? ASSOCIATE : CLIENT  
      vsn client_type == :associate ? associate_vsn : customer_vsn
    }
  }
end

上面列为 client_type_id 的标签在 XML 文件中显示为 client_type_id,但这不是正确的 XML 标签名称格式。我需要它们 client-type-id.

我尝试将此行替换为:

:"client-type-id" client_type == :associate ? ASSOCIATE : CLIENT 

但我得到:

syntax error, unexpected tIDENTIFIER, expecting '}'
    :"client-type-id" client_type == :associate ? ASSOCIATE : CLIENT 
                                 ^

或:

:"client-type-id" (client_type == :associate ? ASSOCIATE : CLIENT)

但我得到:

syntax error, unexpected '(', expecting '}'
        :"client-type-id" (client_type == :associate ? ASSOCIATE : CLIENT)
                           ^

有没有办法告诉Nokogiri::XML::Builder:

  1. 在每行的基础上,使用破折号作为标签名称,它有不同的语法吗?
  2. 对于整个文档,在创建期间或之后,对元素名称中的所有下划线使用破折号,以便它形成格式正确的 XML 元素名称?

有一种奇特的方法可以做到这一点:

Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
  ...
  xml.send :"client-type-id", (client_type == :associate ? ASSOCIATE : CLIENT)
  ...
end