2010-10-07 4 views
8

Mi piacerebbe utilizzare Nokogiri per inserire i nodi in un documento XML. Nokogiri usa la classe Nokogiri::XML::Builder per inserire o creare un nuovo XML.Nokogiri e formattazione XML quando si inseriscono i tag

Se creo XML utilizzando il metodo new, io sono in grado di creare bello, in formato XML:

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

puts builder 

emette il seguente:

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

che è grande, ma quello che ho voglio fare è aggiungere l'XML sopra ad un documento esistente, non creare un nuovo documento. Secondo la documentazione Nokogiri, questo può essere fatto utilizzando il metodo del costruttore with, in questo modo:

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

puts builder 

Quando faccio questo, però, l'XML tutto viene messo in una sola riga senza solco. Ecco come si presenta:

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

mi sto perdendo qualcosa per farlo formattare correttamente?

risposta

11

trovato la risposta nella mailing list Nokogiri:

In XML, spazi bianchi può essere considerato significativo. Se si analizza un documento che contiene nodi di spazi vuoti, libxml2 presuppone che gli spazi bianchi nodi siano significativi e non li inserirà per .

Si può dire che gli spazi bianchi libxml2 non è significativa passando la bandiera "noblanks" al parser. Per dimostrare, ecco un esempio che riproduce il vostro errore, poi fa quello si vuole:

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 

uscita:

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

ero alla ricerca di una bandiera, l'altro giorno, quando ho visto la tua domanda, ma si è distratta rasando uno yak. +1 a te per trovare la risposta e pubblicarla, e +1 a Nokogiri per dondolare. –

+0

comprensibile. quegli yak non si radono (ancora). – michaelmichael

+5

Si noti che sotto Ruby 1.9 è possibile specificare il flag single noblanks in maniera leggermente più concisa: 'doc = Nokogiri :: XML (xml, &: noblanks)' – Phrogz