我如何使用冒号:在nokogiri节点名称中?

Ope*_*erX 7 ruby xml ruby-on-rails nokogiri ruby-on-rails-3

我希望以下代码中的节点名称为"node:name",而是将名称放入字段的文本中.

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
Run Code Online (Sandbox Code Playgroud)

如何在nokogiri的节点名中使用冒号或其他特殊字符?

mat*_*att 11

在我看来,你有三个选择:

1.您正在使用名称空间

然后,您可以声明命名空间并使用该xml[]方法:

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

输出:

<root xmlns:node="http://example.com">
  <node:name/>
</root>
Run Code Online (Sandbox Code Playgroud)

如果要在根元素上添加命名空间,则此方法有点棘手,请参阅使用Nokogiri构建器创建带有命名空间根元素的XML文档.

2.您没有使用名称空间,但希望/需要带冒号的元素名称

在这种情况下,您需要将名为"node:name"的方法发送到xmlblock参数.您可以使用普通的ruby send方法执行此操作:

builder = Nokogiri::XML::Builder.new do |xml|
  xml.root do
    xml.send 'node:name'
  end
end
Run Code Online (Sandbox Code Playgroud)

这个输出:

<?xml version="1.0"?>
<root>
  <node:name/>
</root>
Run Code Online (Sandbox Code Playgroud)

你不确定这个"命名空间"业务到底是什么

在这种情况下,您最好避免在元素名称中使用冒号.替代方案可以是替代使用-.如果你这样做,你需要使用上面的方法2,但有xml.send 'node-name'.我包含这个选项是因为你没有在你的问题中提到命名空间,并且在它们中使用冒号(如方法1所示),所以你更安全,不使用冒号来避免任何未来的问题.