2012-03-24 24 views
49

मैं एक्सएमएल स्कीमा और डब्लूएसडीएल में इस्तेमाल किए गए लक्ष्य नामस्थान के उद्देश्य को समझना चाहता हूं। वास्तव में, चीजों को सरल रखने के लिए, आइए इस प्रश्न को एक्सएमएल स्कीमा तक सीमित करें।हमें लक्ष्य नामस्थान की आवश्यकता क्यों है?

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

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

अद्यतन:

एक उदाहरण देने के लिए, अगर मैं एक एक्सएमएल उदाहरण दस्तावेज में निम्नलिखित:

<p:Person 
    xmlns:p="http://contoso.com/People" 
    xmlns:v="http://contoso.com/Vehicles" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation= 
    "http://contoso.com/schemas/Vehicles 
    http://contoso.com/schemas/vehicles.xsd 
    http://contoso.com/schemas/People 
    http://contoso.com/schemas/people.xsd"> 
    <name>John</name> 
    <age>28</age> 
    <height>59</height> 
    <v:Vehicle> 
     <color>Red</color> 
     <wheels>4</wheels> 
     <seats>2</seats> 
    </v:Vehicle> 
</p:Person> 

जैसे क्यों people.xsd स्कीमा को एक लक्ष्य नामस्थान परिभाषित करने की आवश्यकता है जो "http://contoso.com/schemas/People" है? हमें xsd दस्तावेज़ में लक्ष्य नेमस्पेस परिभाषा की आवश्यकता क्यों है? ऐसा लगता है कि स्कीमालोकेशन के नामस्थान भाग से आपको जो कुछ हासिल करना है, वह पहले ही एक्सएमएल इंस्टेंस दस्तावेज़ में निहित है। Xsd दस्तावेज़ में बराबर मान के साथ लक्ष्य नामस्थान के अस्तित्व को लागू करने का क्या लाभ है?

पॉल जवाब देने के लिए फ़ॉलो-अप प्रश्न:

आप मुझे एक ठोस उदाहरण दे सकते हैं जहां XSD तत्व नामों के बीच इस तरह के "संघर्ष" स्पष्ट हो जाता है और उस targetNamespace के लिए की जरूरत समझाएंगे?


ठीक है, यहां मेरे अपने प्रश्न का उत्तर देने का प्रयास है। अगर आपको यह सुसंगत लगता है तो मुझे बताएं। पॉल द्वारा लिखे गए पेज पर उदाहरणों को देखते हुए मेरी मदद की।

यदि हम ऊपर दिए गए मूल प्रश्न में XML उदाहरण उदाहरण लेते हैं, तो हमारे पास वाहन तत्व की परिभाषा के दो संदर्भ हैं। एक एक्सएमएल इंस्टेंस दस्तावेज़ में स्वयं स्पष्ट और दृश्यमान है, लेकिन हमें यह भी कल्पना करनी चाहिए कि person.xsd XML स्कीमा उसी वाहन परिभाषा को फिर से व्यक्ति के अनुमत बाल तत्व के रूप में संदर्भित करता है। यदि हम सामान्य नामस्थानों का उपयोग करना चाहते थे, जहां प्रत्येक दस्तावेज़ को वाहन के लिए अपना नामस्थान परिभाषित करने की अनुमति थी, तो हम कैसे जानेंगे कि XML उदाहरण वाहन के लिए समान XML स्कीमा परिभाषा का संदर्भ दे रहा है जैसा कि person.xsd है? एकमात्र तरीका नेमस्पेस की अवधारणा को लागू करना है जो मूल सरल से कठोर है और जिसे कई दस्तावेज़ों में बिल्कुल वही लिखा जाना चाहिए।

अगर मैं इसे टैबलेट पर नहीं लिख रहा था तो मैं एक कोड उदाहरण प्रदान करूंगा, लेकिन यहां मैं केवल उस उदाहरण का वर्णन करने का प्रयास करूंगा जो मेरे मन में है।

कल्पना कीजिए कि हमारे पास वाहन तत्व के लिए दो अलग-अलग XML स्कीमा परिभाषाएं हैं। LOCATION1/वाहनों।xsd में ऐसी परिभाषा होगी जो इस पोस्ट के प्रश्न (रंग, पहियों और सीटों के बाल तत्वों) के उदाहरण से उदाहरण को मान्य करेगी, जबकि स्थान 2/veh.xsd में वाहन तत्व के लिए पूरी तरह से अलग परिभाषा होगी, (कहें, बाल तत्वों के साथ वर्ष, मॉडल, और मात्रा)। अब, यदि एक्सएमएल इंस्टेंस दस्तावेज़ स्थान 1 स्कीमा को संदर्भित करता है, जैसा उपर्युक्त उदाहरण में है, लेकिन person.xsd कहता है कि व्यक्ति तत्व में स्थान 2 स्कीमा में परिभाषित प्रकार के वाहन बच्चे तत्व हो सकते हैं, फिर धारणा के बिना एक लक्ष्य नामस्थान का, एक्सएमएल उदाहरण मान्य होगा, भले ही यह स्पष्ट रूप से सही प्रकार का वाहन अपने व्यक्ति तत्व के बच्चे तत्व के रूप में न हो।

लक्ष्य नामस्थान तब हमें यह सुनिश्चित करने में मदद करते हैं कि यदि दो अलग-अलग दस्तावेज एक ही तीसरे एक्सएमएल स्कीमा का संदर्भ दे रहे हैं, तो वे दोनों एक ही स्कीमा का संदर्भ दे रहे हैं और न सिर्फ एक स्कीमा जिसमें तत्व समान हैं, लेकिन समान नहीं हैं एक और ...

क्या इससे कोई समझ आती है?

उत्तर

13

प्रश्न: "परंपरा के मुताबिक हम URI/URL का उपयोग, लेकिन हम किसी भी स्ट्रिंग है, जो हम फिर XML नोड्स द्वारा पुन: उपयोग के लिए एक उपसर्ग को असाइन करने और गुण, या के लिए डिफ़ॉल्ट नाम स्थान के रूप में उपयोग केवल इस्तेमाल कर सकते हैं हाथ में दायरा। "

ए: हाँ, बिल्कुल।

प्रश्न: "किसी कारण से XML स्कीमा के आविष्कारक महसूस किया सरल नामस्थान की धारणा काफी नहीं था और वे targetNamespace लागू करने के लिए था।"

एक: http://www.liquid-technologies.com/Tutorials/XmlSchemas/XsdTutorial_04.aspx

एकाधिक फ़ाइलों में तोड़कर स्कीमा के कई फायदे हैं कर सकते हैं। आप पुनः उपयोग करने योग्य परिभाषाएं बना सकते हैं जिनका उपयोग कई परियोजनाओं में किया जा सकता है। वे परिभाषाओं को पढ़ने और संस्करण को आसान बनाते हैं क्योंकि वे स्कीमा को छोटी इकाइयों में विभाजित करते हैं जो प्रबंधित करने के लिए सरल हैं।

...

यह सब नामस्थान के बिना ठीक काम करता है, लेकिन अगर विभिन्न टीमों शुरू अलग फ़ाइलों पर काम कर रहा है, तो आप नाम संघर्ष की संभावना है, और यह हमेशा स्पष्ट जहां एक परिभाषा था नहीं होगा से आते हैं। समाधान एक अलग नामस्थान के भीतर प्रत्येक स्कीमा फ़ाइल के लिए परिभाषाओं को रखना है।

स्पष्टीकरण:

  • XML स्कीमा का प्राथमिक उद्देश्य "शब्दसंग्रह" घोषित करने के लिए है।

  • इन शब्दावली को नामस्थान द्वारा पहचाना जा सकता है जो लक्ष्य नामस्थान विशेषता में निर्दिष्ट है।

  • स्कीमा (एक एक्सएमएल दस्तावेज़) में "नेमस्पेस" हो सकता है। दस्तावेज़ का वर्णन "शब्दावली" में "targetNamespace" हो सकता है।

  • जैसे ही एक्सएमएल स्कीमा एसजीएमएल डीटीडी (एक्सएमएल सोचा डीटीडी के मूल आर्किटेक्ट्स के मूल आर्किटेक्ट्स) की तुलना में उच्च स्तर का अमूर्तता प्रदान करते हैं, एक्सएमएल स्कीमा "लक्ष्य नामस्थान" "सरल नामस्थान" पर एक अमूर्त स्तर प्रदान करते हैं।

'होप कि

+0

पॉल, इस तरह के त्वरित उत्तर के लिए धन्यवाद! चर्चा सामान्य और टिप्पणियों की धारा के बाहर रखने के लिए मैं अपने मूल प्रश्न में एक फॉलो-अप प्रश्न पोस्ट करूंगा ... – Student

+0

क्या 'एक्सएमएलशेमा-इंस्टेंस' के बारे में कुछ पवित्र है? – CodyBugstein

+1

बीटीडब्ल्यू भयानक लिंक! यह बहुत अच्छी तरह से समझाया गया है – CodyBugstein

4

में मदद करता है यह मेरे लिए स्पष्ट आप वास्तव में क्या कह रहे हैं नहीं है। स्पष्ट रूप से एक स्कीमा में कई अलग-अलग नामस्थानों में घटकों की परिभाषाएं हो सकती हैं, और कहने का कोई तरीका होना चाहिए "यह नेमस्पेस एन में तत्व ई की घोषणा है"। एक्सएसडी के डिजाइनरों ने भाषा को डिजाइन करना चुना ताकि एक स्कीमा दस्तावेज़ में सभी घोषणाएं उसी नामस्थान से संबंधित हों, जिसे मॉड्यूल का लक्ष्य नामस्थान कहा जाता है। इसे अलग-अलग पैक किया जा सकता था, लेकिन अंतर बहुत सतही होगा। नेमस्पेस के साथ मॉड्यूल को संरेखित करने के निर्णय के साथ आपको क्या लगता है गलत है?

+0

प्रिय माइकल, मुझे आपके उत्तर देने के लिए सम्मानित किया गया है! उन दिनों में जब मैं बहुत सारे xslt कर रहा था, मैं आपके नाम पर बहुत कुछ आया :)। निश्चित रूप से यह सब समझ में आता है, मुझे बस अपने आप को स्पष्ट रूप से बैठने में मुश्किल हो रही है। – Student

15

आप सही रास्ते पर लग रहे हैं। मैं यहां कुछ बिंदु बनाउंगा जो मदद कर सकते हैं।

  • एक उदाहरण दस्तावेज़ के भीतर, आप एक्सएमएल नामस्थान का उपयोग नाम स्थान कि एक तत्व या विशेषता है
  • एक स्कीमा दस्तावेज़ के भीतर में।, आप तत्वों और विशेषताओं को उदाहरणों में दिखाई देगा की घोषणा की पहचान। उन्होंने किस नामस्थान में घोषित किया है? यही लक्ष्य नेमस्पेस के लिए है।
  • स्कीमा दस्तावेज़ स्थान और नामस्थान एक ही चीज़ नहीं हैं। एक ही लक्ष्य नामस्थान के साथ एकाधिक .xsd दस्तावेज़ होना आम बात है। (वे या एक दूसरे के शामिल हो सकते हैं सकता है, लेकिन आम तौर पर एक दूसरे के शामिल होंगे।)
  • उदाहरण दस्तावेज हमेशा एक xsi की जरूरत नहीं है: schemaLocation तत्व पारसर्स जहां स्कीमा पता लगाने के लिए बताने के लिए। प्रासंगिक स्कीमा दस्तावेज़ों का पता लगाने के लिए एक पार्सर को बताने के लिए विभिन्न विधियों का उपयोग किया जा सकता है। एक एक्सएसडी स्थानीय डिस्क या कुछ वेब पते पर स्थित हो सकता है और इससे तत्वों के नामस्थान को प्रभावित नहीं करना चाहिए।
    • xsi: schemaLocation एक संकेत है। पार्सर्स कहीं और दिए गए नेमस्पेस के लिए स्कीमा का पता लगा सकते हैं, जिसका अर्थ है कि उन्हें यह जानने में सक्षम होना चाहिए कि स्कीमा किस नामस्थान के लिए है।
    • उपकरण, जैसे डाटाबेसिंग टूल्स, स्कीमा प्रीकंपाइल करेंगे और कोड तैयार करेंगे जो मान्य दस्तावेज़ों को पहचानते हैं। ये घोषित तत्वों के नामस्थानों को जानने में सक्षम होना चाहिए।

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

9

मैं इसे दोनों उदाहरण दस्तावेज़ और एक ही समय को समझने के लिए क्या targetNamespace करता है पर स्कीमा दस्तावेज़ को देखने के लिए मदद करता है लगता है। इस पर विचार करें (अपने उदाहरण दस्तावेज़ के आधार पर):

<p:Person 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://localhost:8080/scribble/xml/Person" 
     xmlns:v="http://localhost:8080/scribble/xml/Vehicle" 
     xsi:schemaLocation=" 
      http://localhost:8080/scribble/xml/Person 
      http://localhost:8080/scribble/xml/person.xsd"> 
    <name>John</name> 
    <age>28</age> 
    <height>59</height> 
    <v:Vehicle> 
     <color>Red</color> 
     <wheels>4</wheels> 
     <seats>2</seats> 
    </v:Vehicle> 
</p:Person> 

कोई डिफ़ॉल्ट दस्तावेज़ के लिए निर्दिष्ट नाम स्थान नहीं है, लेकिन पी: * और वी: * विशिष्ट एन एस यूआरआई के लिए एलियास की गई हैं।अब स्कीमा स्वयं दस्तावेज़ पर एक नज़र डालें:

<?xml version="1.0" encoding="UTF-8"?> 
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://localhost:8080/scribble/xml/Person" 
    elementFormDefault="qualified" 
    xmlns:v="http://localhost:8080/scribble/xml/Vehicle"> 

    <import 
     namespace="http://localhost:8080/scribble/xml/Vehicle" 
     schemaLocation="http://localhost:8080/scribble/xml/v.xsd"/> 

    <element name="Person"> 
     <complexType> 
      <sequence> 
       <element name="name" form="unqualified" type="NCName"/> 
       <element name="age" form="unqualified" type="integer"/> 
       <element name="height" form="unqualified" type="integer"/> 
       <element ref="v:Vehicle"/> 
      </sequence> 
     </complexType> 
    </element> 

</schema> 

और

<?xml version="1.0" encoding="UTF-8"?> 
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://localhost:8080/scribble/xml/Vehicle" 
    elementFormDefault="qualified"> 

    <element name="Vehicle"> 
     <complexType> 
      <sequence> 
       <element name="color" form="unqualified" type="NCName"/> 
       <element name="wheels" form="unqualified" type="integer"/> 
       <element name="seats" form="unqualified" type="integer"/> 
      </sequence> 
     </complexType> 
    </element> 
</schema> 

आप टैग पर विशेषताओं को देखें, तो डिफ़ॉल्ट नाम स्थान "http://www.w3.org/2001/XMLSchema" के लिए दोनों स्कीमा दस्तावेज है ... लेकिन लक्ष्य नामस्थान एक उदाहरण दस्तावेज में उपनाम नामस्थान के रूप में प्रयोग किया जाता है।

लक्ष्य नामस्थान स्कीमा दस्तावेज़ों के नामस्थान और उदाहरण दस्तावेज़ में निर्दिष्ट किसी भी अन्य नामस्थान के बावजूद उदाहरणों की अपेक्षित नामस्थान है।

मुझे इस बारे में सोचने में मदद मिलती है कि एक पार्टी की मेजबानी की तरह जहां आपके पास अतिथि सूची और नाम-टैग पहने हुए अतिथि हैं। अतिथि सूची में नामों जैसे स्कीमा दस्तावेज़ों में लक्ष्य नामस्थान के बारे में सोचें। उदाहरण के दस्तावेजों में xmlns, aliased या नहीं, मेहमानों पर नाम-टैग की तरह है। जब तक आपके पास अतिथि सूची (जो चमत्कारिक रूप से उनके राज्य द्वारा जारी आईडी की एक फोटोकॉपी शामिल करती है), जब भी आप किसी से सामना करते हैं तो आप उनकी पहचान मान्य कर सकते हैं। यदि आप नाम-टैग पहनने वाले किसी व्यक्ति से आते हैं जो संलग्न पैरामीटर से मेल नहीं खाता है, तो आप बाहर निकल सकते हैं (यानी एक त्रुटि फेंक दें)।

स्कीमा/उदाहरणों के साथ

, तुम हो:

स्कीमा:

targetNamespace="http://localhost:8080/scribble/xml/Person" 
targetNamespace="http://localhost:8080/scribble/xml/Vehicle" 

उदाहरण:

xmlns:p="http://localhost:8080/scribble/xml/Person" 
xmlns:v="http://localhost:8080/scribble/xml/Vehicle" 

या ... किसी भी मेहमान के उपनाम "वी" है कि आप कहीं मुठभेड़ पार्टी (विशेष नियमों को छोड़कर जो अन्यथा कहती हैं), घर की किसी भी मंजिल या पिछवाड़े में या पूल में,नाम की अतिथि सूची में अतिथि के विवरण से बेहतर मिलान करें 0। या वे घुसपैठ कर रहे हैं।

वे विशेष नियम कुछ कह सकते हैं, वी केवल तभी बाहर निकल सकता है जब वे तुरंत पी के पास हों, या पी केवल उपस्थित हो सकता है यदि वी मौजूद है। इस मामले में, पी को लटका देना है जब वी वहां है, लेकिन वी वहां कहीं भी कहीं भी बिना कहीं भी जा सकता है।

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

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