Использование Nokogiri для создания XML-элемента с пространством имен - PullRequest
4 голосов
/ 16 февраля 2011

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

<content:encode>text</content>

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

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

но выдает ошибку.

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

1 Ответ

11 голосов
/ 16 февраля 2011
  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, но вы хотите только первый дополнительный элемент root, выполните:

xml_str = builder.doc.root.children.first.to_s
#=> "<encoded:content>text</encoded:content>"
...