2014-09-30 3 views
2

Я использую Rails 2.1.0 и Nokogiri 1.6.1. То, что я хочу, кажется довольно простым. Я хочу, чтобы мой Rails Rest API для возврата XML с элементом, как это:Как создать элемент xml с атрибутом и значением в Nokogiri

<PeopleNumber unit="NumberOfPeople">2.235075</PeopleNumber> 

Я пытался писать что-то вроде:

xml = Nokogiri::NML::Builder.new do |xml| 
    xml.PeopleNumber(:unit => "NumberOfPeople") 2.235075 

ActionController выстреливает синтаксической ошибки.

Если я пытаюсь переписывания это как

xml = Nokogiri::NML::Builder.new do |xml| 
    xml.PeopleNumber(:unit => "NumberOfPeople") { 2.235075 } 

я получаю что-то вроде

<PeopleNumber unit="NumberOfPeople" /> 

Кто-нибудь знает способ получить желаемое поведение в Nokogiri?

+0

Проверьте свой код и отформатируйте его правильно, чтобы мы могли помочь. http://stackoverflow.com/help/formatting – Ernest

+0

Возможный дубликат [установить атрибут тега и добавить текстовый текст в тег с помощью nokogiri builder (ruby)] (http://stackoverflow.com/questions/16219343/set-tag -attribute-and-add-plain-text-content-to-the-tag-using-nokogiri-builder) –

+0

Спасибо @JustinKo. Ваше решение отлично поработало. Довольно легко, как только у вас будет решение! – user1327955

ответ

0

ли это простой способ:

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> 

Хитрость заключается в том add_child, который может принимать предопределенный узел или строку, состоящую из XML вы хотите добавить. Из документации:

Добавить node_or_tags в качестве дочернего узла этого узла. node_or_tags может быть Nokogiri :: XML :: Node, :: DocumentFragment, a :: 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> 

Или вы можете напрямую изменять 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> 

Есть и другие способы сделать это дополнительно, но вам действительно нужно использовать все, что лучше подходит для вашей головы.

+0

Думаю, я тоже мог бы это сделать. Но это кажется более беспорядочным? Я не знаю. Я также задался вопросом, является ли это хорошим способом создания ответа от контроллера API. Не критика, просто вопрос @theTinMan. – user1327955

Смежные вопросы