2010-10-07 4 views
8

Ich möchte Nokogiri verwenden, um Knoten in ein XML-Dokument einzufügen. Nokogiri verwendet die Klasse Nokogiri::XML::Builder, um neues XML einzufügen oder zu erstellen.Nokogiri und XML-Formatierung beim Einfügen von Tags

Wenn ich XML erstellen mit der new Methode, ich bin in der Lage schön, formatiert XML zu erstellen:

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

puts builder 

gibt das folgende:

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

Das ist großartig, aber, was ich Ich möchte das obige XML zu einem vorhandenen Dokument hinzufügen und kein neues Dokument erstellen. Nach Angaben der Nokogiri Dokumentation, kann dies durch Verwendung des with Methode des Builder durchgeführt werden, etwa so:

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

puts builder 

Wenn ich dies tun, aber die XML alle in eine einzige Zeile ohne Einzug gelegt werden. Es sieht so aus:

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

Fehle ich etwas, um es richtig zu formatieren?

Antwort

11

Konnten Sie die Antwort in der Nokogiri Mailingliste:

In XML können Leerzeichen sinnvoll angesehen werden. Wenn Sie ein Dokument mit Whitespace-Knoten analysieren, wird libxml2 davon ausgehen, dass die Whitespace-Knoten sinnvoll sind und sie nicht für Sie einfügen.

Sie können libxml2 sagen, dass Whitespace nicht sinnvoll ist, indem Sie die "noblanks" -Flag an den Parser übergeben. Um zeigen, ist hier ein Beispiel, dass Ihre Fehler wiedergibt, dann tut, was Sie wollen:

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 

Ausgang:

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

Ich war auf der Suche nach einem Flagge neulich, als ich sah, Ihre Frage, aber wurde abgelenkt, ein Yak rasierend. +1 für Sie, um die Antwort zu finden und es zu veröffentlichen, und +1 an Nokogiri für das Schaukeln. –

+0

verständlich. diese Yaks rasieren sich (noch) nicht. – michaelmichael

+5

Beachten Sie, dass Sie unter Ruby 1.9 das einzelne Noblanks-Flag etwas knapper spezifizieren können: 'doc = Nokogiri :: XML (xml, &: noblanks)' – Phrogz

Verwandte Themen