如何在 Nokogiri 中创建具有属性和值的 xml 元素

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 中获得所需行为的方法?

the*_*Man 1

用简单的方法来做:

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)

除此之外,还有其他方法可以做到这一点,但具体取决于您是否使用最适合您头脑的方法。