使用名称空间创建节点

问题描述:

我正在使用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?

+0

[添加命名空间使用Nokogiri的XML生成器]可能的重复(http://*.com/questions/8009842/adding-namespace-using-nokogiris-xml-builder) – Phrogz 2012-08-04 02:58:33

+0

是的,这是重复的,我没有尽管如此,在我发布之前,请看。 – cbmanica 2013-02-20 21:12:48

哦,在这里我们去:Adding namespace using Nokogiri's XML Builder

显然,你要么不能创建过程中做到这一点,或者它是如此困难,即便如此不能弄明白。但是你可以它创建后:

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 

这是恼人的,但。