如何在Nokogiri节点名称中使用冒号(“:”)

问题描述 投票:7回答:2

我希望下面的代码中的节点名称为“ 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

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

ruby-on-rails ruby xml nokogiri
2个回答
11
投票

据我所见,您有三个选择:

  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>
    

    但是,如果要在根元素上添加名称空间,则此方法会比较棘手。参见“ How to create an XML document with a namespaced root element with Nokogiri Builder”。

  2. not使用名称空间,但想要/需要一个带有冒号的元素名称:

    在这种情况下,需要将名为“ node:name”的方法发送到xml块参数。您可以使用常规的红宝石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
投票
builder = Nokogiri::XML::Builder.new do  |xml|
  xml.send("foo:bar") do
  end
end


?> puts builder.to_xml
<?xml version="1.0"?>
<foo:bar/>
© www.soinside.com 2019 - 2024. All rights reserved.