2011-07-27 10 views
8

बिल्डर को 'śćż' और ऐसे अन्य वर्णों को एन्कोड करने के लिए कैसे बनाएं। मैं जो चाहता हूं वह 'cłość' को अक्षरशः XML दस्तावेज़ में मुद्रित किया जाना है। उदाहरण:रेल + बिल्डर। इकाइयों के बिना जेनरेट एक्सएमएल आउटपुट

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&#322;o&#347;&#263;</RodzajPaczki> 
    <Program>mine</Program> 
    <WersjaProgramu>1.0</WersjaProgramu> 
    </Informacje> 
</Trader> 

ca&#322;o&#347;&#263;całość होना चाहिए। मैंने छद्म समाधान देखा जैसे xml.RodzajPaczki {|t| t << 'całość' } लेकिन यह सही ढंग से काम नहीं करता है। यह एक दस्तावेज़ के बाईं तरफ 'całość' पुरानी है।

उत्तर

9

यहां क्या हो रहा है। जैसा कि हम डिफ़ॉल्ट रूप से जानते हैं बिल्डर 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> 

वांछित के रूप में पाठ से बच नहीं है। ध्यान दें कि पैच इस गैर-भागने वाले व्यवहार को सभी पाठों पर लागू करेगा, इसलिए यदि आप केवल कुछ पाठ को बचाना चाहते हैं, जबकि अन्य टेक्स्ट अभी भी बच निकले हैं तो आपको बिल्डर को बहुत अधिक हद तक पैच करना होगा।

+0

प्रतिक्रिया में देरी के लिए खेद है। बहुत जानकारीपूर्ण जवाब। धन्यवाद। –

+0

क्या मैं इंडेंट को शून्य में कॉन्फ़िगर करना संभव है यदि मैं दृश्य में एक्सएमएल बिल्डर ऑब्जेक्ट का उपयोग कर रहा हूं? –

0

मैं अपने सेटअप का उपयोग करके इसे दोहराना नहीं कर सकता। आप किस रूबी/रेल/निर्माता का उपयोग कर रहे हैं?

+0

रूबी संस्करण 1.8.7 एंटरप्राइज़ संस्करण, रेल 2.3.5, निर्माता 2.1 लेकिन मैं 100% निश्चित नहीं हूं। मेरा मतलब है कि अब मैं काम से बाहर हूं और मेरे पास रेलों को बनाए रखने के लिए कई परियोजनाएं हैं। –

+0

ठीक है। मैंने अपनी निजी मशीन पर रेल 3.0.9 रूबी 1.9.2 और बिल्डर 3.0.0 के साथ एक ही व्यवहार को आसानी से दोहराया। तो बिल्डर में 'całość' साहित्यिक आउटपुट करने का कोई तरीका नहीं है, 'सी ł ओ ś ć '? –

0

मैं समस्याओं के बिना "całość" आउटपुट कर सकता हूं (रूबी 1.9.2, बिल्डर 3.0.0)। मैनुअल पेज http://builder.rubyforge.org/$KCODE से 'UTF8' (पृष्ठ का बहुत अंत देखें) सेट करने का सुझाव देता है, लेकिन मुझे लगता है कि यह रूबी 1.8 के लिए है।

#!/usr/bin/ruby -wE UTF-8:UTF-8 
# encoding: UTF-8 

require 'builder' 
... 

xml = Builder::XmlMarkup.new(:target => target, :indent => 2) 
xml.instruct! :xml, :version => '1.0', :encoding => 'UTF-8' 
... 
0

Rails ticket #1446 में एक टिप्पणी दर्शाती है कि इस बिल्डर 3.0.0 में तय किया जा सकता है: क्या मैं अपने फ़ाइल में है, की तरह कुछ है। हालांकि मैंने अभी तक कोशिश नहीं की है।