2011-12-06 12 views
17

मैं वर्तमान में एक एक्सएमएल दस्तावेज़ बनाने के लिए नोकोगिरी :: एक्सएमएल :: बिल्डर क्लास का उपयोग कर रहा हूं, फिर उस पर .to_xml को कॉल कर रहा हूं। परिणामी स्ट्रिंग में हमेशा नोड्स के बीच रिक्त स्थान, लाइनफीड्स और कैरिज रिटर्न का एक गुच्छा होता है, और मैं अपने जीवन के लिए यह नहीं समझ सकता कि उन्हें कैसे छुटकारा पाना है। यहाँ एक उदाहरण है:कैरिज रिटर्न के बिना नोकोगिरी टू_एक्सएमएल

b = Nokogiri::XML::Builder.new do |xml| 
    xml.root do 
    xml.text("Value") 
    end 
end 

b.to_xml 

निम्नलिखित में यह परिणाम:

<?xml version="1.0"?><root>Value</root> 

यह कैसे किया जा सकता है:

<?xml version="1.0"?> 
<root>Value</root> 

क्या मैं चाहता हूँ यह (नोटिस लापता newline) है? अग्रिम में धन्यवाद!

उत्तर

29

Builder#to_xml डिफ़ॉल्ट आउटपुट स्वरूपित (यानी इंडेंट) एक्सएमएल द्वारा। लगभग अनफॉर्मेटेड परिणाम प्राप्त करने के लिए आप Nokogiri::XML::Node::SaveOptions का उपयोग कर सकते हैं।

b = Nokogiri::XML::Builder.new do |xml| 
    xml.root do 
    xml.foo do 
     xml.text("Value") 
    end 
    end 
end 

b.to_xml 
#=> "<?xml version=\"1.0\"?>\n<root>\n <foo>Value</foo>\n</root>\n" 

b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML) 
#=> "<?xml version=\"1.0\"?>\n<root><foo>Value</foo></root>\n" 

अब आप या तो सिर्फ एक्सएमएल हैडर (जो वैसे भी वैकल्पिक है) से छुटकारा पाने सकता है और पिछले न्यू लाइन

b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION).strip 
#=> "<root><foo>Value</foo></root>" 

बस एक्सएमएल में किसी भी नई-पंक्तियों को हटाने शायद नई-पंक्तियों के रूप में एक बुरा विचार है को दूर वास्तव में महत्वपूर्ण हो सकता है (उदाहरण के लिए एक्सएचटीएमएल के <pre> ब्लॉक)। यदि यह आपके लिए मामला नहीं है (और आप वास्तव में इसके बारे में निश्चित हैं) तो आप इसे कर सकते हैं।

+0

दुर्भाग्य से मैं नोकोगिरी v1.3.3 का उपयोग कर फंस गया हूं जो किसी भी तर्क को to_xml तक पारित करने की अनुमति नहीं देता है। अन्यथा, यह एक अच्छा समाधान होगा। – Cameron

+1

आह ठीक है, समझ गया। ऐसा लगता है कि आप to_xml: 'b.doc.serialize (: save_with => Nokogiri :: XML :: नोड :: SaveOptions :: AS_XML)' – Cameron

+2

मेरा अंतिम समाधान के बजाय सहेजने के विकल्प को सहेजकर सहेजने के विकल्प को पास करके इस विधि का उपयोग कर सकते हैं। ऐसा लगता है: 'builder.doc.serialize (: save_with => Nokogiri :: XML :: नोड :: SaveOptions :: AS_XML) .sub (" \ n "," ") .strip' – Cameron

3

ऐसा कुछ नहीं है जो नोकोगिरी को करने के लिए डिज़ाइन किया गया है। आप बस धोखा और कर सकता है, वैकल्पिक रूप से

require 'nokogiri' 

b = Nokogiri::XML::Builder.new{ |xml| xml.root{ xml.foo "Value" } } 
p b.to_xml 
#=> "<?xml version=\"1.0\"?>\n<root>\n <foo>Value</foo>\n</root>\n" 

p b.doc.serialize(save_with:0) 
#=> "<?xml version=\"1.0\"?>\n<root><foo>Value</foo></root>\n" 

flat_root = b.doc.root.serialize(save_with:0) 
p flat_root 
#=> "<root><foo>Value</foo></root>" 

puts %Q{<?xml version="1.0"?>#{flat_root}} 
#=> <?xml version="1.0"?><root><foo>Value</foo></root> 

: निकटतम आप प्राप्त कर सकते हैं कोई नई पंक्तियों या खरोज के साथ दस्तावेज़ की जड़ को क्रमानुसार, और फिर (यदि आप वास्तव में इसकी जरूरत) पीआई खुद को जोड़ने के लिए है

puts b.doc.serialize(save_with:0).sub("\n","") 
#=> <?xml version="1.0"?><root><foo>Value</foo></root> 

नोट केवल करने के लिए sub बजाय gsub के उपयोग पहली ज्ञात-वर्तमान न्यू लाइन की जगह।

+0

यह समाधान लगभग स्वीकृत एक जैसा है - धन्यवाद! – Cameron

-1

b.to_xml एक स्ट्रिंग देता है। आपको केवल स्ट्रिंग में \n के पहले उदाहरण को प्रतिस्थापित करने की आवश्यकता है।

require 'nokogiri' 

b = Nokogiri::XML::Builder.new do |xml| 
    xml.root do 
    xml.text("Value") 
    end 
end 

b.to_xml.sub("\n",'') 

विधि को ओवरलोड करने की कोशिश करने से शायद आसान है।

+2

केवल पहले स्थानांतरित करना \ n काम नहीं करेगा - जो दस्तावेज़ मैं वास्तव में बना रहा हूं वह कई स्तरों को गहरा है, और प्रत्येक नोड के बाद \ n है। नोड्स में से कुछ पाठ में \ n अक्षर भी शामिल हैं, जिन्हें मुझे संरक्षित करना है (यह एंड्रॉइड के लिए है, जिसके लिए जावा-स्टाइल स्ट्रिंग की आवश्यकता है)। – Cameron

संबंधित मुद्दे