我使用Nokogiri创建XML。我希望拥有以下结构:
我尝试了这段代码:
<content:encode>text</content>
我尝试了这段代码:
xml.content['encoded'] {xml.text "text"}
但是它给我一个错误。
我该如何正确编写?类似的例子在引用声明的命名空间中。
你的例子没有意义;你说你想要"encode",然后你试图写"encoded"。
你的例子没有意义,因为它不是有效的XML。你有一个带有命名空间content
的开放encode
标签,然后你尝试用content
标签关闭它。你想要的是<content:encode>text</content:encode>
或者你想要<encode:content>text</encode:content>
。(你想要哪一个?)
你没有按照你给出的链接中的示例来操作。如果你想要一个命名空间为encoded
的content
元素,那么根据示例,你应该这样写:
xml['encoded'].content{ xml.text "text" }
然而,正如该示例所示,你必须声明你想要引用的任何命名空间。因此,请执行以下操作:
require 'nokogiri'
builder = Nokogiri::XML::Builder.new do |xml|
xml.root('xmlns:encoded' => 'bar') do
xml['encoded'].content{ xml.text "text" }
end
end
puts builder.to_xml
#=> <?xml version="1.0"?>
#=> <root xmlns:encoded="bar">
#=> <encoded:content>text</encoded:content>
#=> </root>
编辑: 如果你确实只需要没有根元素的单个元素,使用Nokogiri太过浪费。只需执行:
str = "Hello World"
xml = "<encoded:content>#{str}</encoded:content>"
puts xml
#=> <encoded:content>Hello World</encoded:content>
如果你确实需要使用 Nokogiri,但只想要第一个子根元素,请执行以下操作:
xml_str = builder.doc.root.children.first.to_s
#=> "<encoded:content>text</encoded:content>"