【问题标题】:How to use a colon (":") in a Nokogiri node name如何在 Nokogiri 节点名称中使用冒号 (":")
【发布时间】:2012-03-10 05:27:16
【问题描述】:

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

require 'nokogiri'

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

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

file << builder.to_xml
file.close
puts builder.to_xml

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

【问题讨论】:

  • 您忘记关闭文件了。
  • 最好的方法是什么?
  • 您可以简单地使用file.close 来完成它,但首选的方法是用一个块打开它,然后它会管理自己的关闭,即使引发异常也是如此。 File.open("...", "w+") { |file| file &lt;&lt; builder.to_xml }

标签: ruby-on-rails ruby xml nokogiri


【解决方案1】:

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

  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. 使用命名空间,但想要/需要一个带有冒号的元素名称:

    在这种情况下,您需要将名为“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. 所示),因此您不使用冒号会更安全,以避免将来出现任何问题。

【讨论】:

  • 我正在围绕预先存在的 xml 标准构建 Web 服务,因此我没有选项,必须使用预定义的模式。您在第 3 点中是正确的,我开始了解名称空间与我拥有但尚未完全理解名称空间的 xsd 文档之间的关系。我的 xml 标准似乎是由来自各种不同命名空间的节点组成的,其中 4 个,2 个 xmlns:xsi 和 xmlns:xs 似乎引用了 w3.org,所以我认为它们是通用的,而不是特定于我的标准。
【解决方案2】:
builder = Nokogiri::XML::Builder.new do  |xml|
  xml.send("foo:bar") do
  end
end


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

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2012-01-23
    • 2012-02-23
    相关资源
    最近更新 更多