Nokogiri 使用 Ruby-Core 方法作为 XML 节点名称

Nokogiri Use Ruby-Core Method as XML Node Name

如何让 Nokogiri 接受 ruby 核心方法作为节点名称,例如

xml.hash Digest::SHA256.file form.survey_xml 应该 return 像这样

<hash>cde6f0dd030aac1d3aa6d231b7c0cc30a34686a6f6780c468ccc64a4822f01e0</hash>

相反,我得到一个错误 ArgumentError: wrong number of arguments (1 for 0) in hash 当然是因为 hash 是一个 ruby 方法。

如何使用 Nokogiri DSL 将节点名称设置为 hash,因为我正在与之交互的 API 需要该节点。

我可以手动创建 xml 但我正在寻找的答案是专门使用 nokogiri

更多信息

这是我要创建的xml:

<?xml version=\"1.0\"?>
  <xforms xmlns=\"http://openrosa.org/xforms/xformsList\">
    <xform>
      <formID>1</formID>
      <name>BLAH BLAH</name>
      <version>1</version>
      <hash>892734982SDHFK238479823749234934</hash> 
  <downloadUrl>/Users/me/workspace/dashboard/public/uploads/survey_xml/survey_xml/2/S_1_.xml</downloadUrl>
  </xform>
</xforms>

这是我的代码:

require 'nokogiri'
require 'digest'

def mine
xml = Nokogiri::XML::Builder.new{ |xml|
    xml.xforms xmlns: 'http://openrosa.org/xforms/xformsList' do 
      @forms.each do |form|
        xml.xform do 
          xml.formID form.id
          xml.name form.name
          xml.version 1
          xml.hash Digest::SHA256.file form.survey_xml.survey_xml.file.file
          xml.downloadUrl form.survey_xml.survey_xml.file.file
       end
      end
    end
}.to_xml
end

基于 dimakura 的 回答:

您可以使用其他 Nokogiri 方法。

xpath:

node.xpath('hash').first

搜索:

node.search('hash').first

children:

xml.children.select{|x| x.name == 'hash'}

如果您正在创建新元素,而不是获取它们。然后你可以添加它们,例如,像这样:

xml.add_child '<hash>hash-code</hash>'

Update 使用 Nokogiri::XML::Builder 时,应使用带下划线的特殊名称 (_):

xml.hash_ 'your-hash'