use*_*955 5 ruby xml ruby-on-rails nokogiri
我正在使用 Rails 2.1.0 和 Nokogiri 1.6.1。我想要的似乎很简单。我希望我的 Rails Rest API 返回带有如下元素的 XML:
<PeopleNumber unit="NumberOfPeople">2.235075</PeopleNumber>
Run Code Online (Sandbox Code Playgroud)
我试着写一些类似的东西:
xml = Nokogiri::NML::Builder.new do |xml|
xml.PeopleNumber(:unit => "NumberOfPeople") 2.235075
Run Code Online (Sandbox Code Playgroud)
ActionController 触发语法错误。
如果我尝试将其重写为
xml = Nokogiri::NML::Builder.new do |xml|
xml.PeopleNumber(:unit => "NumberOfPeople") { 2.235075 }
Run Code Online (Sandbox Code Playgroud)
我得到类似的东西
<PeopleNumber unit="NumberOfPeople" />
Run Code Online (Sandbox Code Playgroud)
有谁知道在 Nokogiri 中获得所需行为的方法?
用简单的方法来做:
require 'nokogiri'
doc = Nokogiri::XML('<foo></foo>')
doc.at('foo').add_child('<PeopleNumber unit="NumberOfPeople">2.235075</PeopleNumber>')
puts doc.to_xml
# >> <?xml version="1.0"?>
# >> <foo>
# >> <PeopleNumber unit="NumberOfPeople">2.235075</PeopleNumber>
# >> </foo>
Run Code Online (Sandbox Code Playgroud)
诀窍是add_child,它可以采用预定义的节点,或者由要添加的 XML 组成的字符串。从文档中:
添加node_or_tags 作为该节点的子节点。node_or_tags 可以是 Nokogiri::XML::Node、::DocumentFragment、::NodeSet 或包含标记的字符串。
“包含标记的字符串”是一种简单的方法。
如果您需要不同的参数值unit或不同的标签本身值,您可以将它们插入字符串中:
foo = 'WheelSize'
bar = '355/113'
doc = Nokogiri::XML('<foo></foo>')
doc.at('foo').add_child("<PeopleNumber unit='#{foo}'>#{bar}</PeopleNumber>")
puts doc.to_xml
# >> <?xml version="1.0"?>
# >> <foo>
# >> <PeopleNumber unit="WheelSize">355/113</PeopleNumber>
# >> </foo>
Run Code Online (Sandbox Code Playgroud)
或者你可以直接修改 DOM 和节点:
doc = Nokogiri::XML('<foo><PeopleNumber /></foo>')
people_number = doc.at('PeopleNumber')
people_number['unit'] = 'fred'
people_number.content = 'ethel'
puts doc.to_xml
# >> <?xml version="1.0"?>
# >> <foo>
# >> <PeopleNumber unit="fred">ethel</PeopleNumber>
# >> </foo>
Run Code Online (Sandbox Code Playgroud)
除此之外,还有其他方法可以做到这一点,但具体取决于您是否使用最适合您头脑的方法。