使用命名空间创建节点

时间:2012-08-04 00:10:02

标签: ruby nokogiri

我正在使用Nokogiri构建一些XML。我需要在名称空间中创建一个声明相同名称空间的节点。像往常一样使用XML,这个过程被证明是非常困难的。我需要看起来像

的XML
<?xml version="1.0"?>
<bar:foo xmlns:bar="http://www.bar.com">
  <bar:baz>baz</bar:baz>
</bar:foo>

这(显然)不会给我:

builder=Nokogiri::XML::Builder.new do |xml|
  # Doesn't put foo in the bar namespace
  xml.foo( "xmlns:bar" => "http://www.bar.com") do
    xml['bar'].baz "baz"
  end
end

这两个都没有:

builder=Nokogiri::XML::Builder.new do |xml|
  # undefined method `namespace_definitions' for #<Nokogiri::XML::Document:0x3fcc11b590ec name="document">
  xml['bar'].foo( "xmlns:bar" => "http://www.bar.com") do
    xml['bar'].baz "baz"
  end
end

如何让Nokogiri为我提供我想要的XML?

1 个答案:

答案 0 :(得分:-1)

哦,我们走了:Adding namespace using Nokogiri's XML Builder

显然你要么在创作过程中不能做到这一点,要么就是如此困难甚至SO都无法弄明白。但是可以在创建后执行此操作:

builder=Nokogiri::XML::Builder.new do |xml|
  xml.foo( "xmlns:bar" => "http://www.bar.com") do
    xml['bar'].baz "baz"
  end
end
root=builder.doc.root
ns=root.namespace_definitions.first # because thankfully there's only one namespace here
root.namespace=tns
但是,这很烦人。