How do I create XML using Nokogiri::XML::Builder with a hyphen in the element name?

匿名 (未验证) 提交于 2019-12-03 02:56:01

问题:

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 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!