Как я могу использовать двоеточие: в имени узла nokogiri? - PullRequest
7 голосов
/ 19 февраля 2012

Мне бы хотелось, чтобы имя узла в следующем коде было «узел: имя», но вместо этого имя вставляется в текст поля.

require 'nokogiri'

file = File.new("/Users/adamar/code/xmler/test.xml", "w+")

builder = Nokogiri::XML::Builder.new do  |xml|
  xml.node:name do

  end
end

file << builder.to_xml

puts builder.to_xml

Как использовать двоеточие или другие специальные символы в имени узла с помощью nokogiri?

Ответы [ 2 ]

11 голосов
/ 20 февраля 2012

На мой взгляд, у вас есть три варианта:

1.Вы используете пространства имен

Затем вы можете объявить пространство имен и использовать метод xml[]:

builder = Nokogiri::XML::Builder.new do |xml|
  xml.root('xmlns:node' => 'http://example.com') do
    xml['node'].name
  end
end

Вывод:

<root xmlns:node="http://example.com">
  <node:name/>
</root>

Этот метод немногохитрее, если вы хотите добавить пространство имен к корневому элементу, см. Создание XML-документа с корневым элементом с пространством имен с помощью Nokogiri builder .

2.Вы не используете пространства имен, но хотите / нуждаетесь в имени элемента с двоеточием

В этом случае вам необходимо отправить метод с именем "node: name" в блок xmlпараметр.Вы можете сделать это с помощью обычного метода ruby ​​send:

builder = Nokogiri::XML::Builder.new do |xml|
  xml.root do
    xml.send 'node:name'
  end
end

и выдает:

<?xml version="1.0"?>
<root>
  <node:name/>
</root>

3.Вы не уверены, что это за бизнес «пространства имен», и все о

. В этом случае вам лучше всего избегать использования двоеточий в именах элементов.Альтернативой может быть использование -.Если вы сделали это, вам нужно будет использовать метод 2 выше, но с xml.send 'node-name'.Я включил эту опцию, потому что вы не упоминаете пространства имен в своем вопросе, и в них используются двоеточия (как показано в методе 1), поэтому вам безопаснее не использовать двоеточия, чтобы избежать каких-либо проблем в будущем.

1 голос
/ 19 февраля 2012
builder = Nokogiri::XML::Builder.new do  |xml|
  xml.send("foo:bar") do
  end
end


?> puts builder.to_xml
<?xml version="1.0"?>
<foo:bar/>
...