Использование Nokogiri для создания элемента XML с пространством имен

Я использую Nokogiri, который создает XML. Я хочу иметь следующую структуру:

<content:encode>text</content>

Я пробовал этот код:

xml.content['encoded'] {xml.text "text"}

но это дает мне ошибку.

Как правильно это написать? Аналогичный пример приведен в Ссылка на объявленные пространства имен.


person Delaf    schedule 16.02.2011    source источник
comment
Хорошая работа, расскажите нам, какой код вы пробовали. В будущем вы всегда должны предоставлять точное сообщение об ошибке, которое вы получили, а не только сообщение об ошибке.   -  person Phrogz    schedule 16.02.2011


Ответы (1)


  1. Ваш пример не имеет смысла; вы говорите, что хотите «закодировать», а затем пытаетесь написать «закодировано».

  2. Ваш пример не имеет смысла, так как это недопустимый XML. У вас есть открывающий тег encode с пространством имен content, а затем вы пытаетесь закрыть его тегом content. Вы хотите либо <content:encode>text</content:encode>, либо хотите <encode:content>text</encode:content>. (Что вы хотите?)

  3. Вы не последовали примеру по ссылке, которую вы дали. Если вам нужен элемент content с пространством имен encoded, то в примере вы должны написать:

    xml['encoded'].content{ xml.text "text" }
    
  4. Однако, как и в примере, вы должны объявить любые пространства имен, на которые хотите сослаться. Итак, сделайте следующее:

    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>"
person Phrogz    schedule 16.02.2011
comment
Спасибо. Но нам нужно получить именно такую ​​структуру. ‹encoded:content›text‹/encoded:content› ‹root xmlns:encoded=bar› .... ‹/root› - лишние строки, они не нужны - person Delaf; 19.02.2011
comment
@Delaf Я не понимаю твоих комментариев. Вам не помогло то, что я пишу? Вы говорите, что вам не нужны новые строки в выводе Nokogiri XML? - person Phrogz; 19.02.2011
comment
Ваш пример - работает. Но он добавляет дополнительные строки в код pastie.org/1581058. - person Delaf; 19.02.2011
comment
@Delaf Я отредактировал ответ, чтобы, возможно, удовлетворить ваши потребности. - person Phrogz; 19.02.2011
comment
Вы не представляете, как сильно вы мне помогли. Спасибо. - person Diego Somar; 13.11.2017