2010-10-07 62 views
8

我想使用Nokogiri將節點插入到XML文檔中。 Nokogiri使用Nokogiri::XML::Builder類來插入或創建新的XML。插入標籤時的Nokogiri和XML格式化

如果我創建使用new方法XML,我能夠創造不錯的,格式化XML:

builder = Nokogiri::XML::Builder.new do |xml| 
    xml.product { 
    xml.test "hi" 
    } 
end 

puts builder 

輸出以下:

<?xml version="1.0"?> 
<product> 
    <test>hi</test> 
</product>  

這是偉大的,我要做的是將上面的XML添加到現有文檔中,而不是創建新文檔。按照引入nokogiri文檔,這可以通過使用Builder的with方法,像這樣做:

builder = Nokogiri::XML::Builder.with(document.at('products')) do |xml| 
    xml.product { 
    xml.test "hi" 
    } 
end 

puts builder 

當我這樣做,但是,XML都被投入到與無壓痕一行。它看起來像這樣:

<products><product><test>hi</test></product></products> 

我是否錯過了某些東西才能正確格式化?

回答

11

發現在引入nokogiri郵件列表答案:

在XML中,空格可以考慮 有意義。如果解析包含空白節點的文檔 ,則012xlibxml2將假定空白 節點有意義,並且不會 爲您插入它們。

通過將 「noblanks」標誌傳遞給解析器,可以告訴libxml2空白 不具有意義。爲了 證明,這裏是 重現你的錯誤的例子,那麼你想要做什麼 :

require 'nokogiri' 
def build_from node 
    builder = Nokogiri::XML::Builder.with(node) do|xml| 
    xml.hello do 
     xml.world 
    end 
    end 
end 

xml = DATA.read 
doc = Nokogiri::XML(xml) 
puts build_from(doc.at('bar')).to_xml 
doc = Nokogiri::XML(xml) { |x| x.noblanks } 
puts build_from(doc.at('bar')).to_xml 

輸出:

<root> 
    <foo> 
    <bar> 
     <baz /> 
    </bar> 
    </foo> 
</root> 
+0

我一直在尋找一個標誌,有一天,當我看到你的問題,但分散剃了犛牛。 +1給你找到答案併發布,+1給Nokogiri搖擺。 – 2010-10-11 21:50:00

+0

可以理解。那些犛牛不會刮鬍子(還)。 – michaelmichael 2010-10-12 17:05:03

+5

請注意,在Ruby 1.9中,您可以用稍微簡潔的方式指定單個noblanks標誌:'doc = Nokogiri :: XML(xml,&:noblanks)' – Phrogz 2011-10-19 15:42:57