2012-04-21 5 views
14

deserializing जब मैं ऑब्जेक्ट पर SimpleXml का उपयोग कर रहा हूं, तो मैं एक XML पर deserialize करने के लिए एंड्रॉइड पर SimpleXml का उपयोग कर रहा हूं, जिसका मेरा कोई नियंत्रण नहीं है। अब, हर बार जब एक्सएमएल बदलता है, तो यह मेरे ऐप को तोड़ देता है क्योंकि मेरे पास ऑब्जेक्ट क्लास में नया तत्व परिभाषित नहीं है। क्या कोई तरीका है कि मैं उन missmaps को अनदेखा करने के लिए SimpleXML निर्दिष्ट कर सकता हूं? प्रलेखन को देखा और इसे हल करने में मेरी सहायता के लिए कुछ भी नहीं मिला।SimpleXML का उपयोग करके, एक्सएमएल तत्वों को अनदेखा कैसे करें मेरे पास

उत्तर

21

मुझे पूरा यकीन है कि आप अपने नियमित @Root@Root(strict=false) के साथ घोषणा को बदलकर सख्त मैपिंग के आसपास जा सकते हैं, जो कि प्रत्येक तत्व को आपकी कक्षा परिभाषा में किसी फ़ील्ड से मेल खाना चाहिए। अधिक सटीक रूप से, प्रलेखन से:

यह निर्धारित करने के लिए प्रयोग किया जाता है कि ऑब्जेक्ट का प्रतिनिधित्व सख्त तरीके से पार्स किया जाना चाहिए या नहीं। सख्त पार्सिंग की आवश्यकता है कि प्रत्येक तत्व और XML दस्तावेज़ में विशेषता वर्ग स्कीमा में एक फ़ील्ड से मेल खाती है। यदि कोई तत्व या विशेषता फ़ील्ड से मेल नहीं खाती है तो पार्सिंग अपवाद के साथ विफल हो जाती है। सख्त पार्सिंग को झूठी पर सेट करना स्रोत XML दस्तावेज़ के भीतर विवरण deserialization के दौरान छोड़ा जा सकता है।

सरल XML प्रोजेक्ट साइट पर ट्यूटोरियल की सूची में an example भी दिया गया है।

+0

एमएच गई जानकारी मुझे दिया, मैं ऊपर 'ढीला मानचित्रण' parm सेट करते समय पढ़ने कर समाप्त हो गया। सहायता के लिए धन्यवाद। – Alex

1

आप अंतिम पैरामीटर के रूप में "झूठी" जोड़कर किसी विशेष read के लिए सभी टैग के लिए अक्षम होने के लिए सख्त मोड निर्दिष्ट कर सकते हैं। their documentation:

क्या एक ऐसी ऑब्जेक्ट से अधिक होना चाहिए जिसके लिए रूट एनोटेशन का उपयोग करके ढीली मैपिंग की आवश्यकता हो, आदर्श समाधान नहीं हो सकता है। ऐसे परिदृश्य में ढीली मैपिंग करने के लिए खुद को दृढ़ता से पूछा जा सकता है। बस मैपिंग के प्रकार को इंगित करने वाली रीड विधि में एक बूलियन पास करें। डिफ़ॉल्ट रूप से persister सख्त मैपिंग का उपयोग करता है, जिसे उपरोक्त उदाहरण में दिखाए गए अनुसार रूट एनोटेशन का उपयोग करके किसी ऑब्जेक्ट पर ऑब्जेक्ट आधार पर ओवरराइड किया जा सकता है। हालांकि, इस डिफ़ॉल्ट को ओवरराइड किया जा सकता है जैसा कि नीचे दिए गए कोड स्निपेट में देखा जा सकता है। serializer.read (Class1.class, स्रोत, गलत):

Contact contact = serializer.read(Contact.class, source, false);