यहां क्या हो रहा है। जैसा कि हम डिफ़ॉल्ट रूप से जानते हैं बिल्डर całość
में गैर ASCII वर्णों से बचेंगे। तुम भी एक संभव तरीके से उल्लेख किया है जैसे कि इस ठीक करने के लिए और वह यह है कि:
xml.RodzajPaczki {|t| t << 'całość' }
दुर्भाग्य से जब आप RodzajPaczki
तत्व को एक ब्लॉक गुजरती हैं, बिल्डर मानता है कि वहाँ कुछ भीतरी एक्सएमएल हो जाएगा, तो यह नई लाइन जोड़ और इंडेंट लागू करता है।
<RodzajPaczki>
całość </RodzajPaczki>
एक आसान तरीका है और एक कठिन रास्ता इसे ठीक करने नहीं है: बेशक हमारे मामले में केवल भीतरी पाठ और कोई एक्सएमएल है वहाँ इसलिए हम कुछ भद्दे उत्पादन की तरह मिलता है। सबसे आसान तरीका है।
कॉन्फ़िगर इंडेंट रहो करने के लिए शून्य
तो फिर तुम अपेक्षा के अनुरूप xml.RodzajPaczki {|t| t << 'całość' }
सब कुछ ऊपर से ठीक उपयोग कर सकते हैं काम करेंगे, लेकिन उत्पादन बहुत प्रिंट नहीं होगा, यह वास्तव में होगा एक पंक्ति में सभी हो:
<?xml version="1.0" encoding="UTF-8"?><Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Informacje><RodzajPaczki>całość</RodzajPaczki><Program>mine</Program><WersjaProgramu>1.0</WersjaProgramu></Informacje></Trader>
यदि आप इसे अच्छी तरह से स्वरूपित करना चाहते हैं तो आप इसे बाहरी सुंदर प्रिंटर के माध्यम से चला सकते हैं।
यदि आपके पास बस सुंदर मुद्रित आउटपुट होना चाहिए और कोई भागना नहीं चाहते हैं, तो हमें बिल्डर को थोड़ी सी पैच करने की आवश्यकता है। इस मुद्दे को ठीक करने का यह एक कठिन तरीका है।
बिल्डर
पैच हम एक अतिरिक्त विकल्प :escape
जोड़ने के लिए हमारे XmlMarkup
वस्तु के प्रारंभकर्ता पैच करने के लिए की जरूरत है। उसी समय हम पैरामीटर के रूप में इस नए विकल्प को लेने के लिए XmlBase
ऑब्जेक्ट को पैच करते हैं। डिफ़ॉल्ट व्यवहार को बनाए रखने के लिए, हम इस नए विकल्प को true
पर डिफ़ॉल्ट करते हैं। हम विधि 10 पर XmlBase
पर पैच करने के लिए हमारे नए विकल्प का उपयोग करने के लिए पैच करें कि क्या हमें टेक्स्ट से बचना चाहिए या नहीं।यहाँ यह क्या लग रहा है की तरह है:
module Builder
class XmlBase
def initialize(indent=0, initial=0, encoding='utf-8', escape=true)
@indent = indent
@level = initial
@encoding = encoding.downcase
@escape = escape
end
def text!(text)
if @escape
_text(_escape(text))
else
_text(text)
end
end
end
class XmlMarkup
def initialize(options={})
indent = options[:indent] || 0
margin = options[:margin] || 0
encoding = options[:encoding] || 'utf-8'
escape = options[:escape]
if escape == nil
escape = true
end
super(indent, margin, encoding, escape)
@target = options[:target] || ""
end
end
end
अब हम निम्नलिखित तरीके (में हमारे नए समझौता बिल्डर का उपयोग कर सकते नोटिस कि जब हम false
के एक मूल्य के साथ XmlMarkup
वस्तु हम अपने नए :escape
विकल्पों में पास का निर्माण):
xml = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>3, :encoding => 'utf-8', :escape => false)
xml.instruct! :xml, :version => '1.0', :encoding => 'UTF-8'
xml.Trader(:'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", :'xmlns:xsd' => "http://www.w3.org/2001/XMLSchema") do
xml.Informacje do
xml.RodzajPaczki('całość')
xml.Program('mine')
xml.WersjaProgramu('1.0')
end
end
उत्पादन इस प्रकार है:
<?xml version="1.0" encoding="UTF-8"?>
<Trader xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Informacje>
<RodzajPaczki>całość</RodzajPaczki>
<Program>mine</Program>
<WersjaProgramu>1.0</WersjaProgramu>
</Informacje>
</Trader>
वांछित के रूप में पाठ से बच नहीं है। ध्यान दें कि पैच इस गैर-भागने वाले व्यवहार को सभी पाठों पर लागू करेगा, इसलिए यदि आप केवल कुछ पाठ को बचाना चाहते हैं, जबकि अन्य टेक्स्ट अभी भी बच निकले हैं तो आपको बिल्डर को बहुत अधिक हद तक पैच करना होगा।
प्रतिक्रिया में देरी के लिए खेद है। बहुत जानकारीपूर्ण जवाब। धन्यवाद। –
क्या मैं इंडेंट को शून्य में कॉन्फ़िगर करना संभव है यदि मैं दृश्य में एक्सएमएल बिल्डर ऑब्जेक्ट का उपयोग कर रहा हूं? –