可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am trying to build an XML document using Nokogiri. Some of the elements have hyphens in them. Here's an example:
require "nokogiri" builder = Nokogiri::XML::Builder.new do |xml| xml.foo_bar "hello" end puts builder.to_xml
Which produces:
<?xml version="1.0"?> <foo_bar>hello</foo_bar>
However, when I try:
builder = Nokogiri::XML::Builder.new do |xml| xml.foo-bar "hello" end
I get:
syntax error, unexpected tSTRING_BEG, expecting kDO or '{' or '(' xml.foo-bar "hello"
Now I realise this is because the hyphen is being interpreted as foo MINUS bar
.
How should I do this?
回答1:
Here you go:
require 'nokogiri' b = Nokogiri::XML::Builder.new do |xml| xml.send(:"fooo-bar", "hello") end puts b.to_xml
回答2:
Bart Vandendriessche's answer works but there is a simpler solution if you only want a text field within the element.
require 'nokogiri' b = Nokogiri::XML::Builder.new do |xml| xml.send(:"foo-bar", 'hello') end puts b.to_xml
Generates:
<?xml version="1.0"?> <foo-bar>hello</foo-bar>
If you need them to be nested then you can pass a block
require 'nokogiri' b = Nokogiri::XML::Builder.new do |xml| xml.send(:'foo-bar') { xml.send(:'bar-foo', 'hello') } end puts b.to_xml
Generates:
<?xml version="1.0"?> <foo-bar> <bar-foo>hello</bar-foo> </foo-bar>
回答3:
Aaron Patterson's answer is correct and will work for element names containing any character that may otherwise be interpreted by the Ruby parser.
Answering Angela's question: to place text inside a element created this way you can do something like this:
require 'rubygems' require 'nokogiri' b = Nokogiri::XML::Builder.new do |xml| xml.send(:'foo.bar') { xml.text 'hello' } end puts b.to_xml