我希望下面的代码中的节点名称为“ node:name
”,但该名称被放在字段的文本中。
require 'nokogiri'
file = File.new("/Users/adamar/code/xmler/test.xml", "w+")
builder = Nokogiri::XML::Builder.new do |xml|
xml.node:name do
end
end
file << builder.to_xml
puts builder.to_xml
如何在带有Nokogiri的节点名称中使用冒号或其他特殊字符?
据我所见,您有三个选择:
您正在使用名称空间
然后您可以声明名称空间并使用xml[]
方法:
builder = Nokogiri::XML::Builder.new do |xml|
xml.root('xmlns:node' => 'http://example.com') do
xml['node'].name
end
end
输出:
<root xmlns:node="http://example.com">
<node:name/>
</root>
但是,如果要在根元素上添加名称空间,则此方法会比较棘手。参见“ How to create an XML document with a namespaced root element with Nokogiri Builder”。
您not使用名称空间,但想要/需要一个带有冒号的元素名称:
在这种情况下,需要将名为“ node:name”的方法发送到xml
块参数。您可以使用常规的红宝石send
方法执行此操作:
builder = Nokogiri::XML::Builder.new do |xml|
xml.root do
xml.send 'node:name'
end
end
此输出:
<?xml version="1.0"?>
<root>
<node:name/>
</root>
您不确定这个“命名空间”业务的目的是什么:
在这种情况下,您最好避免在元素名称中使用冒号。
一种替代方法是改用-
。如果这样做,则需要使用上面的方法2,但要使用xml.send 'node-name'
。我包含此选项是因为您没有在问题中提及名称空间,而是在其中使用了冒号(如方法1所示),因此,不使用冒号来避免将来出现任何问题就更安全。
builder = Nokogiri::XML::Builder.new do |xml|
xml.send("foo:bar") do
end
end
?> puts builder.to_xml
<?xml version="1.0"?>
<foo:bar/>