2011-11-22 17 views
15

डीटीडी से एक्सएसडी तक माइग्रेट करना और किसी कारण से संक्रमण एक बेवकूफ है। मैं समझता हूं कि एक बार जब मैं <xs:schema> रूट टैग के अंदर हूं, तो स्कीमा को परिभाषित करने के लिए, लेकिन शीर्षलेख & नामस्थान घोषणा सामग्री मेरे लिए विशेष रूप से भ्रमित साबित हो रही है।एक्सएमएल स्कीमा हैडर और नेमस्पेस कॉन्फ़िगर

मैं W3S पर अच्छी तरह से रखे गए ट्यूटोरियल का पालन करने का प्रयास कर रहा हूं लेकिन यहां तक ​​कि यह ट्यूटोरियल भी बहुत सारे ज्ञान को सामने लेता है।

मुझे लगता है कि मैं क्या तलाश कर रहा हूँ एक राजा का अंग्रेजी स्पष्टीकरण जिम्मेदार बताते हैं, जिनमें से क्या है, जहां वे जाना करते हैं, और क्यों है:

  • xmlns
  • xmlns: XS
  • xmlns: xsi
  • targetNamespace
  • xsi: schemaLocation

और में कुछ मामलों में मुझे विभिन्न तत्वों इन तत्वों/विशेषताओं जैसे कि xsi दिखाई देता है, जिसमें xsi:schemaLocation="..." और xs:import schemaLocation="..." जैसी दो अलग-अलग टिप्पणियां दिखाई देती हैं।

मुझे लगता है कि इन सभी मामूली विविधताओं के बीच मुझे लगता है कि इनमें से प्रत्येक के सिर या पूंछ बनाने की प्रतीत नहीं होती है। इस भ्रम के लिए कोई स्पष्टता लाने के लिए अग्रिम धन्यवाद!

उत्तर

56

सबसे पहले आपको समझने की आवश्यकता होगी XML नामस्थान हैं। यदि आपके पास बर्बाद करने के लिए कुछ समय है, तो आप the specification पढ़ सकते हैं। मैंने यह एक्सएमएल से संबंधित स्पष्ट चश्मा में से एक पाया। इससे कोई फर्क नहीं पड़ता कि आप जो कुछ भी कहते हैं उसे समझ में नहीं आता है, यह एक अच्छा आधार है। लेकिन यहां एक त्वरित रैंड डाउन है।

एक्सएमएल तत्वों और विशेषताओं का नाम है। जब आप <test att="hello"/> देखते हैं, तो आप "test" नाम वाले तत्व को देख रहे हैं, जिसमें हमारे पास "att" नाम के साथ एक विशेषता है। लेकिन यह वास्तव में पूरी कहानी नहीं है ...

एक्सएमएल एक वाक्यविन्यास है जो आपको विभिन्न मार्कअप भाषाओं से सामग्री मिश्रण करने की अनुमति देता है। उदाहरण के लिए, एक्सएमएलटी का उपयोग एक्सएमएलएल पेज को एक्सएचटीएमएल पेज में बदलने के लिए करते समय, आप एक्सएमएल में परिभाषित कम से कम तीन मार्कअप भाषाओं से निपट रहे हैं: आपके इनपुट दस्तावेज़, एक्सएसएलटी और एक्सएचटीएमएल। इस तरह के मिश्रण अधिक कठिन हो जाएंगे यदि प्रत्येक व्यक्ति ने अपने तत्व/विशेषता नाम आरक्षित किए हैं और किसी भी टकराव की अनुमति नहीं थी।

एक्सएमएल नेमस्पेस दर्ज करें। एक एक्सएमएल नेमस्पेस "गोलाकार" को परिभाषित करता है जिसमें तत्व और विशेषता नामों में वास्तविक अर्थशास्त्र होता है। एक्सएसएलटी नेमस्पेस में तत्व "टेम्पलेट" का एक अच्छी तरह से परिभाषित अर्थ है। एक्सएमएल स्कीमा नेमस्पेस में तत्व "कॉम्प्लेक्स टाइप" का एक अच्छी तरह से परिभाषित अर्थ है। यदि आप एक्सएमएल का उपयोग करके अपनी खुद की मार्कअप भाषा में उपयोग करना चाहते हैं, तो यह संभव है बशर्ते आप एक अलग नेमस्पेस में ऐसा करें।

यह सुनिश्चित करने के लिए कि नामस्थान अद्वितीय है, आपको कुछ अद्वितीय पहचानकर्ता प्रदान करना होगा। यूआरआई के उपयोग पर विनिर्देशन, अक्सर एक HTTP यूआरएल के रूप में। इसका कारण सरल है: ऐसे यूआरएल अच्छे अद्वितीय पहचानकर्ता होते हैं। लेकिन यह भ्रम के लिए भी एक बहुत ही आम कारण है क्योंकि लोग सोचते हैं कि यूआरएल वास्तव में अर्थ रखता है या एक्सएमएल प्रोसेसिंग के दौरान नेटवर्क पर पहुंचाया जाएगा। बहुत अच्छी तरह से पता है कि यह मामला नहीं है! यूआरएल किसी भी मौजूदा संसाधन को इंगित करने के लिए आवश्यक नहीं है। यह किसी भी परिवर्तन के माध्यम से नहीं होगा या किसी नेटवर्क पते पर हल नहीं होगा।पहले test तत्व उस नामस्थान में भी है, क्योंकि हमने उपसर्ग का उपयोग नहीं किया है, लेकिन हम उस डिफ़ॉल्ट नामस्थान के दायरे में हैं। उपसर्ग so के साथ दूसरा test तत्व नामस्थान http://www.stackoverflow.com में निहित है क्योंकि यही वह है जिसे हमने उपसर्ग को बाध्य किया है।

तो फिर तीसरा, सबसे कम test तत्व है। इसमें क्या नामस्थान है? इसमें उपसर्ग नहीं है, इसलिए यह डिफ़ॉल्ट नामस्थान में होना चाहिए। लेकिन, हमने दूसरे टेस्ट तत्व में अपना डिफ़ॉल्ट नेमस्पेस बदल दिया है! तो अब वह सबसे निचला तत्व http://www.bar.com नामस्थान से संबंधित है, http://www.foo.com नहीं।

अभी तक उलझन में है? बस निम्नलिखित याद रखें:

  • एक नामस्थान केवल एक स्ट्रिंग है। अद्वितीय पहचानकर्ताओं के पास यूआरआई का सुविधाजनक तरीका है।
  • नामस्थान का प्रतिनिधित्व करने के लिए एक उपसर्ग का उपयोग किया जाता है, लेकिन इसका नाम कोई अर्थ नहीं है। बस इसे प्लेसहोल्डर के रूप में सोचें।
  • आप एक डिफ़ॉल्ट नामस्थान सेट कर सकते हैं। अपने दायरे के भीतर सभी तत्व जिनके पास उपसर्ग नहीं है, फिर इसका हिस्सा बन जाते हैं।

ओह। अब, डब्ल्यू 3 सी एक्सएमएल स्कीमा पर। यह सब कैसे संबंधित है?

ठीक है, स्टार्टर्स के लिए एक्सएमएल स्कीमा एक्सएमएल में परिभाषित एक मार्कअप भाषा है। तो इसका कारण यह है कि इसे अपना नामस्थान मिलता है। और वह नामस्थान आधिकारिक तौर पर http://www.w3.org/2001/XMLSchema है। यदि आप S को कम मामले के रूप में लिखते हैं, तो यह गलत है। यह देखना शुरू हो रहा है कि क्यों कुछ लोग वास्तव में नामस्थान से नफरत करते हैं?

निम्नलिखित तीन दस्तावेजों बिल्कुल वैसा ही कर रहे हैं:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
</xsd:schema> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
</xs:schema> 

<schema xmlns="http://www.w3.org/2001/XMLSchema"> 
</schema> 

सभी कि मायने रखती है हम XML स्कीमा नाम स्थान से सामान का उपयोग कर रहे हैं। एक सम्मेलन के रूप में, लोग XML स्कीमा में उपसर्ग xs या xsd का उपयोग करते हैं।

जब हमारे पास एक XML दस्तावेज़ है, तो हम यह निर्दिष्ट करना चाहेंगे कि इसके लिए स्कीमा कहां स्थित है। एक से अधिक स्कीमा एक XML दस्तावेज़ के लिए प्रासंगिक हो सकते हैं, क्योंकि जैसा कि हमने कहा है कि भाषाओं को XML में मिश्रित किया जा सकता है। यह कहने के लिए कि एक एक्सएमएल दस्तावेज़ स्कीमा का एक उदाहरण है, एक बार फिर एक विशेष नामस्थान उपलब्ध है: http://www.w3.org/2001/XMLSchema-instance। सम्मेलन से, हम इस नामस्थान को xsi उपसर्ग करने के लिए बाध्य करते हैं। लेकिन फिर, यह अनिवार्य नहीं है।

उस स्कीमा इंस्टेंस नेमस्पेस में परिभाषित कुछ विशेषताएं हैं। उनमें से schemaLocation और noNamespaceSchemaLocation हैं। इस दस्तावेज़ पर एक नज़र डालें:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.foo.com/schema"> 
</root> 

क्या खुशी है? सबसे पहले हमने कहा कि हम xsi को नामस्थान http://www.w3.org/2001/XMLSchema-instance पर उपसर्ग xsi बाध्यकारी कर रहे हैं। फिर हम उस नामस्थान के भीतर एक विशेषता का उपयोग कर रहे हैं: noNamespaceSchemaLocation। वह विशेषता हमें बताती है कि स्कीमा दस्तावेज़ के उन हिस्सों को मान्य करने के लिए कहां स्थित है जो किसी भी विशेष नामस्थान में नहीं हैं। निम्नलिखित XML दस्तावेज़ बिल्कुल वैसा ही है, शब्दार्थ:

<root xmlns:huh="http://www.w3.org/2001/XMLSchema-instance" huh:noNamespaceSchemaLocation="http://www.test.com/schema"> 
</root> 

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

फिर यह तथ्य है कि इसे noNamespaceSchemaLocation कहा जाता है। एक स्कीमा "लक्ष्य नामस्थान" को परिभाषित करता है। यह क्या करता है यह बताता है कि तत्वों और गुणों को परिभाषित करने वाले गुणों का नाम क्या है। लेकिन लक्ष्य नामस्थान छोड़ा जा सकता है। उस स्थिति में, हमें नामस्थान के बिना एक्सएमएल दस्तावेजों के लिए एक स्कीमा मिला है। इस तरह की एक स्कीमा को noNamespaceSchemaLocation के साथ संदर्भित किया जा सकता है।

कई मामलों में, एक स्कीमा वास्तव में नामस्थान परिभाषित करेगा। यह कहने के लिए कि कौन सा स्कीमा किस नामस्थान से संबंधित है, हम http://www.w3.org/2001/XMLSchema-instance नामस्थान से अन्य विशेषता का उपयोग कर सकते हैं: schemaLocation। उस विशेषता में नामस्थान यूआरआई और स्कीमा यूआरआई के जोड़े (रिक्त स्थान से अलग) हो सकते हैं। मान लें कि हमारे पास http://www.myschemas.com/foo-schema पर स्थित नेमस्पेस http://www.foo.com के लिए स्कीमा है। तब हम कह सकते हैं कि इस प्रकार है:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.foo.com http://www.myschemas.com/foo-schema http://www.bar.com http://www.randomschemas.com/bar-schema"> 
</root> 

क्या तुम यहाँ याद करने की आवश्यकता है कि http://www.w3.org/2001/XMLSchema-instance सामान एक्सएमएल दस्तावेजों हैं कि में उपयोग के लिए है:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.foo.com http://www.myschemas.com/foo-schema"> 
</root> 

यहाँ कई नाम स्थान-स्थान जोड़े के साथ एक उदाहरण है schemas के उदाहरण। नेमस्पेस http://www.w3.org/2001/XMLSchema वह स्कीमा को स्वयं परिभाषित करने के लिए उपयोग किया जाता है।


अब हम यूआरआई और विशेष अर्थ के साथ अजीब दिखने विशेषताओं में हमारी गर्दन करने वाले हैं तो द्वारा। नामस्थानों के साथ यह बात है: जब तक आप यह नहीं समझते कि वे कितने सरल हैं, वे बहुत जटिल दिखते हैं। बस यूपीआई के नाम से क्या उपसर्ग है, और यह पता है कि यूआरआई क्या परिभाषित करता है, इस पर नज़र डालें। xs:import और xs:include:

वहाँ स्कीमा मैं अपने प्रश्न के लिए पता करने के लिए की जरूरत के बारे में दो और बातें है। ध्यान दें कि मैंने xs उपसर्ग सम्मेलन का उपयोग कैसे किया है, क्योंकि हम डब्ल्यू 3 सी एक्सएमएल स्कीमा के बारे में बात कर रहे हैं।

शामिल तत्व का उपयोग उसी लक्ष्य नामस्थान के साथ स्कीमा को गठबंधन करने के लिए किया जा सकता है। असल में यह हमें छोटे भागों में स्कीमा को मॉड्यूलर करने और उन्हें एक साथ रखने की अनुमति देता है।

आयात तत्व समान प्रकार का है, लेकिन स्कीमा के लिए विभिन्न लक्ष्य नामस्थान के साथ। यह हमें विभिन्न मार्कअप भाषाओं के लिए स्कीमा को गठबंधन करने की अनुमति देता है।


संक्षिप्त करने के लिए

तो:

  • xmlns: एक डिफ़ॉल्ट नाम स्थान निर्दिष्ट करने के लिए इस्तेमाल किया।
  • xmlns:prefix: prefix पर नामस्थान को बांधने के लिए उपयोग किया जाता है।
  • http://www.w3.org/2001/XMLSchema: एक्सएमएल स्कीमा के लिए नामस्थान। सम्मेलन द्वारा अक्सर xs उपसर्ग करने के लिए बाध्य किया जाता है, लेकिन यह अनिवार्य नहीं है और न ही यह स्वचालित रूप से किया जाता है।
  • http://www.w3.org/2001/XMLSchema-instance: नामस्थान जो एक XML दस्तावेज़ को स्कीमा का उदाहरण है, के विवरण घोषित करने के लिए उपयोगी चीजों का एक समूह परिभाषित करता है। सम्मेलन द्वारा अक्सर xsi उपसर्ग करने के लिए बाध्य किया जाता है, लेकिन यह अनिवार्य नहीं है और न ही यह स्वचालित रूप से किया जाता है।
  • targetNamespace: एक विशेषता जो एक्सएमएल स्कीमा (मूल तत्व पर) में उपयोग की जा सकती है, यह निर्दिष्ट करने के लिए कि कौन सा नेमस्पेस एक स्कीमा परिभाषा है।
  • schemaLocation: नामस्थान http://www.w3.org/2001/XMLSchema-instance द्वारा परिभाषित विशेषताओं में से एक, यह इंगित करने के लिए उपयोग किया जाता है कि एक या अधिक नामस्थानों के लिए एक या अधिक स्कीमा कहां मिल सकते हैं।

मेरी अंतिम सलाह: स्कीमा के खिलाफ दस्तावेजों को प्रमाणित करने और थोड़ा सा खेलने के लिए कुछ सुविधाजनक तरीका ढूंढें। नामस्थानों के साथ प्रयोग, शामिल और आयात। एकाधिक नामस्थानों का उपयोग करके दस्तावेज़ बनाएं और स्कोपिंग आज़माएं।

उसके बाद, एक्सएमएल के विनिर्देशों, एक्सएमएल नेमस्पेस और एक्सएमएल स्कीमा की जांच करें। यह कट्टर पढ़ना है, लेकिन यदि आप इसके माध्यम से अपना रास्ता बनाते हैं तो आपको समझ में आ जाएगा कि एक्सएमएल का उपयोग करने के वर्षों के बाद भी कई लोग याद करते हैं। आखिरकार यह सब समझ में आएगा।

गुड लक!

+3

सहमत हूं यह महाकाव्य है - इस प्रकार के प्रश्न का निश्चित उत्तर होना चाहिए, अगर स्टैक ओवरफ़्लो इस सुविधा का समर्थन करता है। इसे पोस्ट करने के लिए धन्यवाद मैंने बहुत कुछ सीखा और देख सकता हूं कि मेरा जवाब वास्तव में क्यों सीमित था। –

+0

@hugh यह भी पूरा नहीं है ... विशेषताओं के लिए, उपसर्गों में कुछ हद तक विचलित नियम हैं। वे डिफ़ॉल्ट रूप से योग्य नहीं हैं। लेकिन मैं पूरी तरह से निश्चित नहीं हूं कि क्या उन्हें तत्व के नामस्थान में रखा गया है या नहीं, इसलिए मैं इसके बारे में बयान देने के लिए सावधान हूं। और वहां और भी सामान है जो मैंने उल्लेख किया था, लेकिन सच्चाई यह है कि केवल चश्मा निश्चित उत्तर प्रदान कर सकते हैं। –

+0

जी_एच यह बेहद दुर्लभ है कि किसी को इस सवाल के जवाब देने के लिए समय लगता है। धन्यवाद! – IAmYourFaja

2

जवाब में आपके प्रश्नों का:

  1. xmlns - एक अनूठा उदाहरण दस्तावेजों में इस्तेमाल से संकेत मिलता है जो XML स्कीमा मूल्य का (या क्या स्कीमा इसके खिलाफ मान्य करेगा) एक उदाहरण है। भले ही नामस्थान वास्तविक स्कीमा फ़ाइल की पहचान नहीं करता है, फिर भी एक स्कीमा होना चाहिए जो इस नामस्थान को परिभाषित करता है।
  2. xmlns:xs - नामस्थान उपसर्ग और उदाहरण दस्तावेजों में इस्तेमाल से संकेत मिलता है जहां एक्सएमएल में इस्तेमाल किया प्रकार से आ रहे हैं प्रथा के अनुसार कहा जाता है। आप इस बारे में using जैसे सी # या imports में वीबी में सोच सकते हैं। उदाहरण के लिए, xmlns:xs="http://mySharedTypes" कहता है कि इस XML में मेरे कुछ प्रकार नामस्थान "http: // mySharedTypes" से आते हैं, और इन प्रकारों को "xs" के साथ उपसर्ग किया जाएगा।
  3. xmlns:xsi - ऊपर के रूप में। वास्तव में एक्सएस और एक्सएसआई उपसर्गों का उपयोग परंपराओं द्वारा किया जाता है जब W3C स्कीमा नेमस्पेस http://www.w3.org/2001/XMLSchema और http://www.w3.org/2001/XMLSchema-instance का संदर्भ देते समय उपयोग किया जाता है। हालांकि इन नामस्थान उपसर्ग सिर्फ सम्मेलन हैं और वास्तव में कुछ भी हो सकते हैं।
  4. targetNamespace - आपके स्कीमा परिभाषा में एक अद्वितीय मूल्य जो आप स्कीमा में उनके नामस्थान को परिभाषित करते हैं, देता है। इसलिए यदि कोई आपकी स्कीमा में प्रकारों का उपयोग करना चाहता है तो उन्हें xmlns विशेषता को अपने लक्ष्य नामस्थान के समान मानों के साथ शामिल करना होगा।
  5. xs:import schemaLocation - यह पारंपरिक रूप से किसी अन्य स्कीमा का सापेक्ष पथ है, हालांकि सभी एक्सएमएल प्रोसेसर इसे पहचान नहीं पाते हैं। इसलिए आप वैकल्पिक रूप से स्कीमा फ़ाइल के शॉर्टकट के रूप में अपने xs:import में किसी अन्य स्कीमा से लिंक कर सकते हैं। आयात में अन्य विशेषता स्कीमा लक्ष्य नामस्थान है, जो अनिवार्य है।
  6. xsi:schemaLocation - हालांकि यह आयात विशेषता के समान नाम साझा करता है, यह एक ही परिभाषा नहीं है। सम्मेलन के अनुसार, xsi नेमस्पेस उपसर्ग http://www.w3.org/2001/XMLSchema-instance नामस्थान से प्रकारों को संदर्भित करता है, जिसका उपयोग स्कीमा दस्तावेज़ों के बजाय उदाहरण दस्तावेज़ों के अंदर किया जाता है।

क्षमा करें अगर उपर्युक्त स्पष्ट नहीं है, तो यह एक खुले अंत प्रश्न का थोड़ा सा है और सामग्री का एक टन है जिसे आप इनमें से किसी एक के लिए लिख सकते हैं। यदि आपको किसी भी बिंदु पर स्पष्टता की आवश्यकता है तो कृपया पूछें - मुझे प्रदान करने में खुशी होगी, या वैकल्पिक रूप से संक्षिप्त दायरे के साथ एक नया प्रश्न बनायेगा।

+0

यह जानकारी पूरी तरह सटीक नहीं है। 'xmlns' एक डिफ़ॉल्ट नेमस्पेस इंगित करता है, इसमें स्कीमा को इंगित करने के साथ कुछ भी करने के लिए कुछ भी नहीं है। कुछ और गलतियां हैं। वे मामूली हो सकते हैं, लेकिन जब नामस्थान और एक्सएमएल स्कीमा की बात आती है तो सबसे छोटी चीज जल्दी से भ्रमित हो सकती है। –

+0

आपको बहुत बहुत धन्यवाद; यह सबसे अच्छा, सबसे गहन, और इस सामान की व्याख्या को समझने में आसान है जो मैंने पार किया है। एक आखिरी विचार: क्या होगा यदि आप फ्लाई पर स्कीमा-अनुरूप एक्सएमएल का निर्माण कर रहे हैं (स्मृति में, जैसा कि कहें, एक स्ट्रिंग): क्या आपको हमेशा "उदाहरण स्ट्रिंग" में यह xmlns, xs, xsi, आदि सामान डालना होगा इसे सत्यापित करने के लिए, या यह केवल एक पार्सर को बताना है कि किस स्कीमा के खिलाफ एक्सएमएल को वैध करना है; फिर स्कीमा में उन सभी defs को शामिल करने के लिए? – IAmYourFaja

+0

@G_H आपकी टिप्पणी के लिए धन्यवाद। कृपया मेरा उत्तर संपादित करने के लिए स्वतंत्र महसूस करें या कृपया अन्य त्रुटियों को इंगित करें और मैं अपने उत्तर में शामिल हो जाऊंगा। –

0
  • xmlns="uri1" और xmlns:whatever="uri2" नामस्थान नोड हैं और विशेषता नहीं हैं। उनकी भूमिका यह कहना है कि जब आप अपने XML दस्तावेज़ में whatever:myElement नामक तत्व देखते हैं, तो तत्व "जो भी" नामस्थान से संबंधित होता है। नामस्थान नोड में घोषित उरी द्वारा यह "जो भी नामस्थान" पहचाना जाता है।
  • targetNamespace एक विशेषता है। इसमें एक यूआरआई है जो आपके स्कीमा में परिभाषित तत्वों, प्रकारों और समूह की पहचान करती है।
  • xsi: schemaLocation काफी अलग है। यह एक विशेषता है जो एक्सएमएल पार्सर्स को एक्सएमएल इंस्टेंस से जुड़ी स्कीमा ढूंढने की अनुमति देती है। आपको स्कीमा में इसकी आवश्यकता नहीं है।
  • xs:import के साथ आप अपने स्वयं के स्कीमा में अपने तत्वों और प्रकारों का उपयोग करने के लिए विभिन्न नामस्थान से स्कीमा आयात कर सकते हैं। xs:import का उपयोग करते समय, आयातित स्कीमा और आयात करने वाली स्कीमा में अलग-अलग नामस्थान होना चाहिए। xs:include का उपयोग करें यदि यह वही नामस्थान है।
संबंधित मुद्दे