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'
如何让 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'