2010-10-07 14 views
8

Chciałbym użyć Nokogiri do wstawienia węzłów do dokumentu XML. Nokogiri używa klasy Nokogiri::XML::Builder do wstawiania lub tworzenia nowego XML.Formatowanie Nokogiri i XML podczas wstawiania tagów

Jeśli utworzyć XML przy użyciu metody new, jestem w stanie stworzyć miłą, sformatowany XML:

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

puts builder 

wyprowadza następujące:

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

To świetnie, ale co ja chcesz zrobić, to dodać powyższy kod XML do istniejącego dokumentu, a nie tworzyć nowego dokumentu. Zgodnie z dokumentacją Nokogiri, można to zrobić za pomocą metody with budowniczym, na przykład tak:

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

puts builder 

Kiedy to zrobić, jednak XML wszystko zostanie wprowadzone w jednym wierszu bez wcięcia. Wygląda to tak:

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

Czy brakuje mi czegoś, aby poprawnie sformatować?

Odpowiedz

11

znaleźć odpowiedź na liście mailingowej Nokogiri:

W XML spacje można uznać znaczące. Jeśli przeanalizujesz dokument zawierający węzły białych znaków, libxml2 przyjmie, że białe znaki są znaczące i nie będą wstawiać ich dla Ciebie.

Możesz powiedzieć libxml2, że białe znaki nie mają znaczenia, przekazując flagę "noblanks" do analizatora składni. Aby wykazać, tutaj jest przykładem, że odtwarza swój błąd, to robi to, co chcesz:

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 

wyjściowa:

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

Szukałem flagą na drugi dzień, kiedy zobaczyłem Twoje pytanie, ale rozpraszało Cię golenie. +1 do ciebie za znalezienie odpowiedzi i wysłanie go, i +1 do Nokogiri za kołysanie. –

+0

zrozumiałe. te jakki się nie golą (jeszcze). – michaelmichael

+5

Zauważ, że pod Ruby 1.9 możesz podać flagę pojedynczego noblanksa w nieco bardziej zwięzły sposób: 'doc = Nokogiri :: XML (xml, &: noblanks)' – Phrogz

Powiązane problemy