2010-10-07 21 views
8

Tôi muốn sử dụng Nokogiri để chèn các nút vào một tài liệu XML. Nokogiri sử dụng lớp Nokogiri::XML::Builder để chèn hoặc tạo XML mới.Nokogiri và định dạng XML khi chèn thẻ

Nếu tôi có thể tạo XML bằng cách sử dụng phương pháp new, tôi có thể để tạo ra tốt đẹp, định dạng XML:

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

puts builder 

kết quả đầu ra như sau:

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

Đó là tuyệt vời, nhưng những gì tôi muốn làm là thêm XML ở trên vào tài liệu hiện có, không tạo tài liệu mới. Theo tài liệu Nokogiri, điều này có thể được thực hiện bằng cách sử dụng phương pháp with của Builder, như vậy:

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

puts builder 

Khi tôi làm điều này, tuy nhiên, tất cả XML được đưa vào một dòng duy nhất không có thụt đầu dòng. Có vẻ như sau:

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

Tôi có thiếu thứ gì đó để định dạng chính xác không?

Trả lời

11

Tìm thấy câu trả lời trong mailing list Nokogiri:

Trong XML, khoảng trắng có thể được coi có ý nghĩa. Nếu bạn phân tích cú pháp tài liệu có chứa các khoảng trắng, libxml2 sẽ giả định rằng khoảng trắng các nút có ý nghĩa và sẽ không chèn chúng cho bạn.

Bạn có thể nói libxml2 khoảng trắng không có ý nghĩa bằng cách chuyển cờ "noblanks" tới trình phân tích cú pháp. Để chứng minh, đây là một ví dụ rằng tái tạo lỗi của bạn, sau đó làm những gì bạn muốn:

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 

Output:

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

tôi đang tìm kiếm một lá cờ ngày khác khi tôi nhìn thấy câu hỏi của bạn, nhưng đã bị xao lãng khi cạo một cái yak. +1 cho bạn để tìm câu trả lời và đăng nó, và +1 cho Nokogiri để lắc lư. –

+0

dễ hiểu. những yaks không cạo mình (chưa). – michaelmichael

+5

Lưu ý rằng trong Ruby 1.9, bạn có thể chỉ định cờ noblanks đơn lẻ theo một cách ngắn gọn hơn: 'doc = Nokogiri :: XML (xml, &: noblanks)' – Phrogz

Các vấn đề liên quan