अशक्त XML तत्वों का प्रतिनिधित्व करने का सही तरीका क्या है?


166

मैंने nullतत्वों को कई तरीकों से दर्शाया है:

तत्व के साथ मौजूद है xsi:nil="true":

 <book>
     <title>Beowulf</title>
     <author xsi:nil="true"/>
 </book>

तत्व मौजूद है, लेकिन एक खाली तत्व के रूप में दर्शाया गया है (जो मुझे लगता है कि 'खाली' के बाद से गलत है और nullशब्दार्थ रूप से भिन्न हैं):

 <book>
     <title>Beowulf</title>
     <author/>
 </book>

 <!-- or: -->
 <book>
     <title>Beowulf</title>
     <author></author>
 </book>

तत्व दिए गए मार्कअप में बिल्कुल भी मौजूद नहीं है :

 <book>
     <title>Beowulf</title>
 </book>

तत्व में एक <null/>बच्चा तत्व है ( नीचे TStamper से):

 <book>
     <title>Beowulf</title>
     <author><null/></author>
 </book>

क्या इस तरह के nullमूल्य का प्रतिनिधित्व करने का एक सही या विहित तरीका है ? क्या उपरोक्त उदाहरणों की तुलना में अतिरिक्त तरीके हैं?

ऊपर दिए गए उदाहरणों के लिए XML से वंचित है, इसलिए इसमें बहुत दूर न पढ़ें। :)

जवाबों:


121

xsi: nil एक मान को दर्शाने का सही तरीका है जैसे: जब DOM स्तर 2 कॉल getElementValue () जारी किया जाता है, तो NULL मान वापस आ जाता है। xsi: शून्य का उपयोग किसी भी तत्व के साथ एक वैध तत्व को इंगित करने के लिए भी किया जाता है, भले ही वह तत्व सामग्री सामान्य रूप से खाली तत्वों की अनुमति न दें।

यदि खाली टैग का उपयोग किया जाता है, getElementValue () खाली स्ट्रिंग लौटाता है ("") यदि टैग छोड़ा गया है, तो कोई लेखक टैग भी मौजूद नहीं है। यह 'शून्य' (पूर्व सेटिंग "श्रृंखला" से शून्य करने के लिए सेट करने की तुलना में शब्दार्थ रूप से भिन्न हो सकता है कि पुस्तक किसी श्रृंखला से संबंधित नहीं है, जबकि श्रृंखला को छोड़ने का मतलब यह हो सकता है कि श्रृंखला वर्तमान तत्व के लिए एक अनुपयुक्त तत्व है।)

प्रेषक: W3C

एक्सएमएल स्कीमा: संरचनाएं संकेत देने के लिए एक तंत्र का परिचय देती हैं कि एक तत्व को · मान्य · के रूप में स्वीकार किया जाना चाहिए जब उसके पास सामग्री प्रकार के बावजूद कोई सामग्री न हो जिसकी आवश्यकता नहीं है या जरूरी नहीं कि वह खाली सामग्री की अनुमति दे। एक तत्व हो सकता है · मान्य · बिना सामग्री के अगर इसमें विशेषता xsi है: मान के साथ शून्य। लेबल किया गया एक तत्व खाली होना चाहिए, लेकिन इसी प्रकार के जटिल प्रकार की अनुमति होने पर विशेषताएँ ले जा सकते हैं।

एक स्पष्टीकरण:
यदि आपके पास एक पुस्तक xml तत्व है और एक बाल तत्व पुस्तक है: इसे भरने के दौरान आपके पास कई विकल्प हैं:

  1. तत्व को पूरी तरह से हटाना - यह तब किया जा सकता है जब आप यह इंगित करना चाहते हैं कि श्रृंखला इस पुस्तक पर लागू नहीं होती है या वह पुस्तक श्रृंखला का हिस्सा नहीं है। इस मामले में xsl ट्रांसफ़ॉर्म (या अन्य ईवेंट आधारित प्रोसेसर) जो कि पुस्तक से मेल खाता है, के लिए एक टेम्प्लेट है: श्रृंखला कभी नहीं कहा जाएगा। उदाहरण के लिए, यदि आपका xsl बुक तत्व को टेबल रो (xhtml: tr) में बदल देता है, तो आपको इस पद्धति का उपयोग करके गलत संख्या में टेबल सेल (xhtml: td) प्राप्त हो सकते हैं।
  2. तत्व को खाली छोड़ना - यह इंगित कर सकता है कि श्रृंखला "" है, या अज्ञात है, या कि पुस्तक श्रृंखला का हिस्सा नहीं है। पुस्तक से मेल खाने वाली कोई भी xsl ट्रांस्फ़ॉर्म (या अन्य सदाबहार आधारित पार्सर) श्रृंखला कहलाएगी। वर्तमान () का मान "" होगा। आपको इस विधि का उपयोग करते हुए उसी तरह के xHTML: td टैग मिलेंगे जैसे कि अगले वर्णित एक के साथ हैं।
  3. Xsi: nil = "true" का उपयोग करना - यह दर्शाता है कि पुस्तक: श्रृंखला तत्व NULL है, न कि केवल खाली। आपका xsl ट्रांस्फ़ॉर्म (या अन्य ईवेंट आधारित पार्सर) जिसमें टेम्प्लेट मैचिंग बुक: सीरीज़ होगी। करंट () का मान खाली (खाली स्ट्रिंग नहीं) होगा। इस पद्धति और (2) के बीच मुख्य अंतर यह है कि स्कीमा प्रकार की पुस्तक: श्रृंखला को खाली स्ट्रिंग ("") को मान्य मान के रूप में अनुमति देने की आवश्यकता नहीं है। यह एक श्रृंखला तत्व के लिए कोई वास्तविक अर्थ नहीं देता है, लेकिन एक भाषा तत्व के लिए जिसे स्कीमा में एक एन्यूमरेटेड प्रकार के रूप में परिभाषित किया गया है, xsi: nil = "true" तत्व को कोई डेटा नहीं होने देता है। एक अन्य उदाहरण प्रकार दशमलव के तत्व होंगे। यदि आप चाहते हैं कि वे खाली रहें तो आप एक एनुमरेटेड स्ट्रिंग को संघटित कर सकते हैं जो केवल "" और एक दशमलव की अनुमति देता है, या एक दशमलव का उपयोग करें जो शून्य है।

11
Xsi का उपयोग करना: nil सही है, लेकिन आपको यह सुनिश्चित करना चाहिए कि यह उचित नामस्थान के भीतर है: xmlns: xsi = " w3.org/2001/XMLSchema-instance "
STW

यह वास्तव में है xmlns:xsi="http://w3.org/2001/XMLSchema-instance"। लापता http: // पर ध्यान दें। यह महत्वपूर्ण है क्योंकि नाम स्थान स्ट्रिंग वास्तव में सिर्फ xml पार्सर के लिए एक स्ट्रिंग है और एक uri नहीं है।
बुरक अरसलान

9
हे, मेरा मानना ​​है कि अभी भी थोड़ा गलत है। यह होना चाहिए xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"। नोट "www।" देखें w3.org/TR/xmlschema-1/#no-xsi
Janne Mattila

जैसा कि मेरे उत्तर में कहा गया है कि मैं व्याख्या से असहमत हूं क्योंकि यह तत्व की स्थिति का प्रतिनिधित्व नहीं है, लेकिन तत्व के उपयोग पर अड़चन
ओककूल

2
@ क्रिस: सच नहीं, xsi:उपसर्ग घोषित किया जाना चाहिए। यदि आप xsi:घोषणा किए बिना उपसर्ग का उपयोग करने का प्रयास करते हैं तो एक नाम स्थान-जागरूक XML पार्सर आपके XML दस्तावेज़ को अस्वीकार कर देगा। यहाँ प्रासंगिक युक्ति w3.org/TR/xml-names/#nsc-NSDeclared ("नामस्थान बाधा: उपसर्ग घोषित") है जो केवल पूर्वनिर्धारित उपसर्ग कहते हैं xml:और हैं xmlns:। XML स्कीमा XML नामस्थान युक्ति के शीर्ष पर बनाता है, लेकिन इसमें कोई अतिरिक्त पूर्वनिर्धारित उपसर्ग नहीं जोड़ा जाता है, क्योंकि ऐसा करने से वास्तव में XML नामस्थान युक्ति का उल्लंघन होगा।
साइमन Kissane

9

कोई विहित उत्तर नहीं है, क्योंकि XML की मूल रूप से कोई अशक्त अवधारणा नहीं है। लेकिन मुझे लगता है कि आप Xml / ऑब्जेक्ट मैपिंग चाहते हैं (चूंकि ऑब्जेक्ट ग्राफ़ में नल हैं); तो आपके लिए जवाब है "जो भी आपके उपकरण का उपयोग करता है"। यदि आप हैंडलिंग लिखते हैं, तो इसका मतलब है कि आप जो भी पसंद करते हैं। XML स्कीमा का उपयोग करने वाले टूल के लिए, xsi:nilजाने का रास्ता है। अधिकांश मैपरों के लिए, मेल खाने वाले तत्व / विशेषता को छोड़ना इसे करने का तरीका है।


8

यह इस बात पर निर्भर करता है कि आप अपने XML को कैसे मान्य करते हैं। यदि आप XML स्कीमा सत्यापन का उपयोग करते हैं, तो nullमूल्यों का प्रतिनिधित्व करने का सही तरीका xsi:nilविशेषता के साथ है ।

[ स्रोत ]


7

W3 लिंक में प्रलेखन

http://www.w3.org/TR/REC-xml/#sec-starttags

कहते हैं कि यह पुन: संशोधित रूप हैं।

<test></test>
<test/>

अन्य उत्तर में वर्णित विशेषता सत्यापन तंत्र है और राज्य का प्रतिनिधित्व नहीं है। कृपया http://www.w3.org/TR/xmlschema-1/#xsi_nil देखें

एक्सएमएल स्कीमा: संरचनाएं संकेत देने के लिए एक तंत्र का परिचय देती हैं कि एक तत्व को · मान्य · के रूप में स्वीकार किया जाना चाहिए जब उसके पास सामग्री प्रकार के बावजूद कोई सामग्री न हो जिसकी आवश्यकता नहीं है या जरूरी नहीं कि वह खाली सामग्री की अनुमति दे। एक तत्व हो सकता है · मान्य · बिना सामग्री के अगर इसमें विशेषता xsi है: मान के साथ शून्य। लेबल किया गया एक तत्व खाली होना चाहिए , लेकिन यदि संबंधित जटिल प्रकार की अनुमति हो तो विशेषताएँ ले जा सकते हैं।

इस उत्तर को स्पष्ट करने के लिए: सामग्री

  <Book>
    <!--Invalid construct since the element attribute xsi:nil="true" signal that the element must be empty-->
    <BuildAttributes HardCover="true" Glued="true" xsi:nil="true">
      <anotherAttribute name="Color">Blue</anotherAttribute>
    </BuildAttributes>
    <Index></Index>
    <pages>
      <page pageNumber="1">Content</page>            
    </pages>
    <!--Missing ISBN number could be confusing and misguiding since its not present-->
  </Book>
</Books>

7
यह खाली तत्वों के लिए सिफारिश है ; क्या आप इस राय से खाली हैं कि === रिक्त है? मेरा मानना ​​है कि दोनों के बीच अंतर है, हालांकि यह अक्सर स्थितिजन्य है। यदि आप बयान कर रहे हैं कि वे समान हैं, तो मैं आपके उत्तर में उस तर्क का उल्लेख करने की सलाह देता हूं।
रोब Hruska

1
रिक्त शून्य के समान नहीं है; अगर ऐसा होता, तो यह स्टैकओवरफ्लो प्रश्न कभी नहीं पूछा जाता। यह उत्तर गलत है। हालांकि, प्रोग्रामर को यह निर्धारित करना चाहिए कि क्या xml पढ़ने वाला तर्क एक लापता तत्व या xsi को संभालने के लिए तैयार है: nil; यदि नहीं, तो इनमें से किसी एक रूप का उपयोग करना आवश्यक हो सकता है; अर्थात्, अशक्त / लुप्त तत्व और एक खाली तत्व के बीच अंतर को खोना आवश्यक हो सकता है।
टूलमेकरसैट

@RobHruska हाँ, आप सही हैं, यह एक खाली तत्व की परिभाषा है, लेकिन अगर W3C परिभाषा को ध्यान में रखें जो कि KitsuneYMG द्वारा इंगित की गई है, तो यह परिभाषित करता है कि तत्व शून्य होना चाहिए और मेरा मानना ​​है कि प्रतिनिधित्व अधिक परिभाषा है टैग तब इसकी वर्तमान स्थिति का प्रतिनिधित्व करता है, इसलिए मैं उस जवाब से असहमत हूं, और विश्वास करता हूं कि रिक्त एक अशक्त तत्व का सबसे अच्छा प्रतिनिधित्व है। विचार सरल है, अच्छी संरचना को बनाए रखने के लिए, आपको सभी तत्वों का प्रतिनिधित्व करने की आवश्यकता है अन्यथा आप इसके अस्तित्व के बारे में नहीं जानते होंगे, और इसलिए इसे गलत तरीके से प्रस्तुत कर सकते हैं।
ओककोल

4

आप का उपयोग xsi:nilतब करते हैं जब आपका स्कीमा शब्दार्थ इंगित करता है कि किसी तत्व का डिफ़ॉल्ट मान है, और यदि तत्व मौजूद नहीं है तो डिफ़ॉल्ट मान का उपयोग किया जाना चाहिए। मुझे यह मानना ​​होगा कि ऐसे स्मार्ट लोग हैं जिनके लिए पूर्ववर्ती वाक्य एक स्व-स्पष्ट रूप से भयानक विचार नहीं है, लेकिन यह मुझे नौ तरह के बुरे लगते हैं। मैंने जो भी XML प्रारूप काम किया है, वह तत्व को छोड़ कर शून्य मानों का प्रतिनिधित्व करता है। (या विशेषता, और सौभाग्य एक विशेषता को चिह्नित करता है xsi:nil।)


यदि कोई दस्तावेज़ प्रकाशन ऐप में आप चाहते हैं कि शीर्षक पृष्ठ पर दिनांक वर्तमान तिथि के लिए डिफ़ॉल्ट हो यदि तत्व में कोई सामग्री नहीं है, तो dateतत्व को पूरी तरह से छोड़ना बहुत मदद नहीं करता है, क्योंकि एप्लिकेशन को पता नहीं होगा कि शीर्षक पृष्ठ पर आप कहाँ चाहते हैं प्रकट होने की तिथि। (यदि छोड़े गए तत्व में केवल एक ही संभव स्थान है, तो यह कोई मुद्दा नहीं है; वास्तविक दस्तावेज़ में लगभग सभी तत्वों में
शब्दशः

4

बस विशेषता या तत्व को छोड़ना कम औपचारिक डेटा में अच्छी तरह से काम करता है।

यदि आपको अधिक परिष्कृत जानकारी की आवश्यकता है, तो GML स्कीमा गुण nilReason जोड़ें, उदाहरण के लिए: GeoSciML में :

  • xsi:nil "true" के मान के साथ यह इंगित करने के लिए उपयोग किया जाता है कि कोई मान उपलब्ध नहीं है
  • nilReasonलापता मूल्यों के लिए अतिरिक्त जानकारी रिकॉर्ड करने के लिए इस्तेमाल किया जा सकता है; यह मानक GML कारणों में से एक हो सकता है ( missing, inapplicable, withheld, unknown), या द्वारा प्रस्तुत पाठ other:, या अधिक विस्तृत विवरण के लिए URI लिंक हो सकता है।

जब आप डेटा का आदान-प्रदान कर रहे हैं, तो भूमिका जिसके लिए एक्सएमएल आमतौर पर उपयोग किया जाता है, एक प्राप्तकर्ता को दिए गए डेटा या किसी दिए गए उद्देश्य के लिए सामग्री अस्पष्ट हो सकती है जो किसी अन्य व्यक्ति को उपलब्ध होगी, जिसने भुगतान किया था या जिनके पास अलग प्रमाणीकरण था। यह जानने के कारण कि सामग्री क्यों गायब थी, बहुत महत्वपूर्ण हो सकती है।

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


2

कई मामलों में एक नल मूल्य का उद्देश्य एक डेटा मूल्य के लिए सेवा करना है जो आपके एप्लिकेशन के पिछले संस्करण में मौजूद नहीं था।

तो आप अपने आवेदन "ReportMaster" संस्करण 1 से एक xml फ़ाइल है।

अब रिपोर्टमास्टर संस्करण 2 में कुछ और विशेषताएं जोड़ी गई हैं जिन्हें परिभाषित किया जा सकता है या नहीं।

यदि आप 'नो टैग का मतलब है नल' प्रतिनिधित्व का उपयोग करते हैं तो आपको अपनी रिपोर्टमास्टर 1 xml फ़ाइल को पढ़ने के लिए स्वचालित रूप से पिछड़ी संगतता मिल जाती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.