2012-04-01 14 views
6

एक्सएमएल स्कीमा प्रमाणीकरण मैं अपनी लाइब्रेरी में कई ऑब्जेक्ट्स के लिए कुछ उपयोगकर्ता निर्दिष्ट डेटा प्रदान करने के लिए एकाधिक XElement ऑब्जेक्ट्स के साथ काम कर रहा हूं। मैं पूरी एक्सएमएल फ़ाइल की संरचना को निर्दिष्ट करने से बचने की कोशिश कर रहा हूं क्योंकि लाइब्रेरी को इस बात की परवाह नहीं करनी चाहिए कि पूरे एक्सएमएल कैसा दिखता है जब तक कि इसे आवश्यक विशिष्ट तत्वों को सही ढंग से संरचित किया जाता है।XElement

उस अंत में, मेरे पास 3 अलग XSD फ़ाइलें हैं जो मेरी कक्षा की आवश्यकताओं में से प्रत्येक 3 XElements के लिए स्कीमा परिभाषित करती हैं, हालांकि मैं स्कीमा के खिलाफ XElement को सत्यापित करने में कुछ समस्याएं चला रहा हूं। कामकाज के बिना ऐसा करने के लिए एक तरीका प्रतीत नहीं होता है।

एमएसडीएन पृष्ठ से, XElement.Validate() विस्तार विधि को बड़ी फ़ाइल के उप-तत्वों को फिर से सत्यापित करने के लिए तैयार किया गया प्रतीत होता है। XmlSchemaObject तर्क मेरी समस्याओं का कारण बन रहा है क्योंकि मुझे लगता है कि यह XElements में से किसी एक में मौजूद नहीं होगा। मुझे लगता है कि तर्क के रूप में पास करने के लिए से XmlSchemaElement से XmlSchemaElement को पकड़कर मैं इस मुद्दे के आसपास काम कर सकता हूं, लेकिन XmlSchemaSet पहले से ही सब कुछ परिभाषित करता है, ऐसा करना अजीब लगता है।

क्या XElement को स्कीमा के साथ पूरे XDocument को सत्यापित किए बिना एक बेहतर विकल्प है?

या मुझे सिर्फ व्यापार परत को एप्लिकेशन में स्कीमा सत्यापन को संभालने देना चाहिए और लाइब्रेरी को XElement सही ढंग से गठित करने दें (मुझे यह विकल्प माना जाता है, लेकिन एक व्यक्तिगत वरीयता के रूप में अपवाद फेंकने से बचने के लिए पसंद करते हैं और बस कॉलिंग विधि पता है कि XElement वापसी पैरामीटर के माध्यम से अमान्य है)।

उत्तर

9

मैं प्रदान की गई एपीआई के साथ आपकी समस्या को समझता हूं, जहां तक ​​मुझे लगता है कि आपके पास दो विकल्प हैं, एक को XDocument में उदा। XDocument doc = new XDocument(xElementToValidate); और फिर the Validate method on that XDocument कॉल करने के लिए जहां सभी आप में पारित करने के लिए XmlSchemaSet, जिस तरह से आप अपने आप को रेखांकित किया, अर्थात् XElement की Validate विधि का उपयोग करने जा रहा है दूसरा विकल्प, सुनिश्चित करें कि आप XmlSchemaSet और में मूल तत्व परिभाषा पारित कर रही है वह स्कीमा XmlSchemaObject के रूप में सेट है। यदि ये केवल एक शीर्ष स्तरीय तत्व परिभाषा के साथ सरल स्कीमा हैं, तो आपको बस इतना करना है।

XmlSchemaSet schemaSet = new XmlSchemaSet(); 
    schemaSet.Add(null, "schema.xsd"); 
    schemaSet.Compile(); 

    XmlSchemaObject schemaObject = schemaSet.GlobalElements.Values.OfType<XmlSchemaObject>().First(); 

आप एक विधि में दो तरीकों में से एक लपेटो है तो यह एक ऐसी ही सुविधा विधि नेट ढांचे की आपूर्ति किया जा सकता था बुला के अलावा कोई और अधिक प्रयास नहीं होना चाहिए।

+0

मुझे नहीं पता कि मैंने अपने 'XElement.Validate() 'एक्सटेंशन विधि में कोड को लपेटने के बारे में क्यों नहीं सोचा था। अब आप इतने तार्किक लगते हैं कि आप इसे कहते हैं। 'एक्सडॉक्यूमेंट' बनाना एक और अच्छा विचार है जो मुझे भी होना चाहिए था (मैंने इसे बदलने के तरीके को जानने का प्रयास करने में बहुत अधिक समय बिताया, और मुझे स्पष्ट समाधान याद आया)। मैं दोनों के साथ प्रयोग करूँगा और देखें कि मैं कौन सा पसंद करता हूं। – psubsee2003

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