xml - एक्सएमएल विशेषता बनाम एक्सएमएल तत्व




xsd (14)

काम पर हमें किसी अन्य ऑफ़लाइन एप्लिकेशन को डेटा पास करने के लिए एक्सएमएल फाइलें बनाने के लिए कहा जा रहा है जो हमारे कुछ डेटा को अपडेट करने के लिए फिर से पास करने के लिए दूसरी एक्सएमएल फाइल बनायेगा। प्रक्रिया के दौरान हम XML फ़ाइल की संरचना के बारे में अन्य अनुप्रयोग की टीम के साथ चर्चा कर रहे हैं।

मैं जिस नमूने के साथ आया था वह अनिवार्य रूप से कुछ है:

<INVENTORY>
   <ITEM serialNumber="something" location="something" barcode="something">
      <TYPE modelNumber="something" vendor="something"/> 
   </ITEM>
</INVENTORY>

दूसरी टीम ने कहा कि यह उद्योग मानक नहीं था और यह गुण केवल मेटा डेटा के लिए उपयोग किया जाना चाहिए। उन्होंने सुझाव दिया:

<INVENTORY>
   <ITEM>
      <SERIALNUMBER>something</SERIALNUMBER>
      <LOCATION>something</LOCATION>
      <BARCODE>something</BARCODE>
      <TYPE>
         <MODELNUMBER>something</MODELNUMBER>
         <VENDOR>something</VENDOR>
      </TYPE>
   </ITEM>
</INVENTORY>

कारण मैंने पहली बार सुझाव दिया कि बनाई गई फ़ाइल का आकार बहुत छोटा है। हस्तांतरण के दौरान फ़ाइल में लगभग 80000 आइटम होंगे। वास्तविकता में उनका सुझाव मैंने सुझाए गए तीन गुना बड़ा हो गया है। मैंने रहस्यमय "उद्योग मानक" की खोज की जिसका उल्लेख किया गया था, लेकिन सबसे नज़दीक मुझे मिल सकता था कि एक्सएमएल विशेषताओं का उपयोग केवल मेटा डेटा के लिए किया जाना चाहिए, लेकिन कहा कि बहस वास्तव में मेटा डेटा के बारे में थी।

लंबी हवादार स्पष्टीकरण के बाद (क्षमा करें) आप कैसे निर्धारित करते हैं कि मेटा डेटा क्या है, और जब किसी XML दस्तावेज़ की संरचना को डिज़ाइन करते हैं तो आपको किसी विशेषता या तत्व का उपयोग करने का निर्णय लेना चाहिए?


एक्सएमएल एलिमेंट बनाम एक्सएमएल विशेषता

एक्सएमएल समझौते के बारे में सब कुछ है। सबसे पहले किसी भी मौजूदा एक्सएमएल स्कीमा या अपने समुदाय या उद्योग के भीतर स्थापित सम्मेलनों को स्थगित करें।

यदि आप वास्तव में जमीन से अपनी स्कीमा को परिभाषित करने की स्थिति में हैं, तो यहां कुछ सामान्य विचार हैं जिन्हें तत्व बनाम विशेषता निर्णय को सूचित करना चाहिए:

<versus>
  <element attribute="Meta content">
    Content
  </element>
  <element attribute="Flat">
    <parent>
      <child>Hierarchical</child>
    </parent>
  </element>
  <element attribute="Unordered">
    <ol>
      <li>Has</li>
      <li>order</li>
    </ol>
  </element>
  <element attribute="Must copy to reuse">
    Can reference to re-use
  </element>
  <element attribute="For software">
    For humans
  </element>
  <element attribute="Extreme use leads to micro-parsing">
    Extreme use leads to document bloat
  </element>
  <element attribute="Unique names">
    Unique or non-unique names
  </element>
  <element attribute="SAX parse: read first">
    SAX parse: read later
  </element>
  <element attribute="DTD: default value">
    DTD: no default value
  </element>
</versus>

"एक्सएमएल" का अर्थ है "एक्सटेन्सिबल मार्कअप लैंग्वेज"। एक मार्कअप भाषा का तात्पर्य है कि डेटा टेक्स्ट है, जो संरचना या स्वरूपण के बारे में मेटाडेटा के साथ चिह्नित है

एक्सएचटीएमएल एक्सएमएल का एक उदाहरण है जिस तरह से इसका इरादा था:

<p><span lang="es">El Jefe</span> insists that you
    <em class="urgent">MUST</em> complete your project by Friday.</p>

यहां, तत्वों और विशेषताओं के बीच भेद स्पष्ट है। टेक्स्ट तत्व ब्राउज़र में प्रदर्शित होते हैं, और विशेषताएँ उन्हें प्रदर्शित करने के बारे में निर्देश हैं (हालांकि कुछ ऐसे टैग हैं जो इस तरह से काम नहीं करते हैं)।

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


ऑब्जेक्ट की गुणों को संग्रहीत करने के लिए दोनों विधियां पूरी तरह मान्य हैं। आपको व्यावहारिक विचारों से दूर जाना चाहिए। निम्नलिखित प्रश्न का उत्तर देने का प्रयास करें:

  1. कौन सा प्रतिनिधित्व तेजी से डेटा पार्सिंग \ पीढ़ी की ओर जाता है?
  2. कौन सा प्रतिनिधित्व तेजी से डेटा हस्तांतरण की ओर जाता है?
  3. क्या पठनीयता महत्वपूर्ण है?

    ...


कुछ बुरी जानकारी के लिए बस कुछ सुधार:

@ जॉन बॉलिंगर: गुणों में कोई भी चरित्र डेटा हो सकता है। <> और "'क्रमशः & lt; & gt; & amp; & quot; और & apos; से बचने की आवश्यकता है। यदि आप किसी XML लाइब्रेरी का उपयोग करते हैं, तो यह आपके लिए इसका ख्याल रखेगा।

नरक, एक विशेषता में एक छवि जैसे बाइनरी डेटा हो सकता है, यदि आप वास्तव में चाहते हैं, बस बेस 64-एन्कोडिंग करके और इसे डेटा बनाकर: URL।

@feenster: गुणों में आईडीएस या NAMES के मामले में स्पेस से अलग एकाधिक आइटम हो सकते हैं, जिसमें संख्याएं शामिल होंगी। Nitpicky, लेकिन यह बचत अंतरिक्ष खत्म हो सकता है।

विशेषताओं का उपयोग जेएसओएन के साथ एक्सएमएल प्रतिस्पर्धी रख सकते हैं। फैट मार्कअप देखें : एक समय में फैट मार्कअप मिथ एक कैलोरी को ट्रिम करना


जब संदेह होता है, KISS - गुणों और तत्वों को मिश्रण क्यों करते हैं जब आपके पास विशेषताओं का उपयोग करने का कोई स्पष्ट कारण नहीं है। यदि आप बाद में एक एक्सएसडी परिभाषित करने का फैसला करते हैं, तो यह क्लीनर भी समाप्त हो जाएगा। फिर यदि आप बाद में अपने एक्सएसडी से कक्षा संरचना उत्पन्न करने का निर्णय लेते हैं, तो यह भी आसान होगा।


दूसरों ने तत्वों से गुणों के बीच अंतर करने के लिए कैसे कवर किया है, लेकिन अधिक सामान्य परिप्रेक्ष्य से गुणों में सबकुछ डालने के कारण यह परिणामस्वरूप एक्सएमएल छोटा है।

एक्सएमएल कॉम्पैक्ट होने के लिए डिज़ाइन नहीं किया गया है लेकिन पोर्टेबल और मानव पठनीय होने के लिए। यदि आप पारगमन में डेटा के आकार को कम करना चाहते हैं तो कुछ और (जैसे कि Google के प्रोटोकॉल बफर ) का उपयोग करें।


मेटा डेटा (तत्व के डेटा के बारे में डेटा) के लिए डेटा और विशेषताओं के लिए तत्वों का उपयोग करें।

यदि कोई तत्व आपके चयन तारों में भविष्यवाणी के रूप में दिखाई दे रहा है, तो आपके पास एक अच्छा संकेत है कि यह एक विशेषता होनी चाहिए। इसी प्रकार यदि किसी विशेषता को भविष्यवाणी के रूप में कभी भी उपयोग नहीं किया जाता है, तो हो सकता है कि यह उपयोगी मेटा डेटा न हो।

याद रखें कि एक्सएमएल मशीन पठनीय नहीं है जिसे मानव पठनीय नहीं है और बड़े दस्तावेज़ों के लिए एक्सएमएल बहुत अच्छी तरह से संपीड़ित है।


मैं feenster से सहमत हूँ। यदि आप कर सकते हैं तो विशेषताओं से दूर रहें। तत्व वेब सेवा टूलकिट के बीच विकास अनुकूल और अधिक अंतःक्रियाशील हैं। गुणों का उपयोग करके आप अपने अनुरोध / प्रतिक्रिया संदेशों को क्रमबद्ध करने वाले टूलकिट कभी नहीं ढूंढ पाएंगे। यह भी समझ में आता है क्योंकि हमारे संदेश एक वेब सेवा टूलकिट के लिए डेटा (मेटाडाटा नहीं) हैं।


मैं इस तरह के विचार-विमर्श के परिणामों से हमेशा आश्चर्यचकित हूं। मेरे लिए यह तय करने के लिए एक बहुत ही सरल नियम है कि डेटा किसी विशेषता या सामग्री के रूप में है या नहीं और यह है कि डेटा में नेविगबल उप-संरचना है या नहीं।

तो उदाहरण के लिए, गैर-मार्कअप टेक्स्ट हमेशा गुणों में आता है। हमेशा।

सूचियां उप-संरचना या सामग्री में हैं। टेक्स्ट जो समय के साथ हो सकता है इसमें एम्बेडेड संरचित उप-सामग्री सामग्री में शामिल है। (मेरे अनुभव में अपेक्षाकृत कम है - मार्कअप के साथ पाठ - डेटा स्टोरेज या एक्सचेंज के लिए एक्सएमएल का उपयोग करते समय।)

इस तरह लिखित एक्सएमएल स्कीमा संक्षिप्त है।

जब भी मैं <car><make>Ford</make><color>Red</color></car> जैसे मामलों को देखता हूं, तो मुझे लगता है कि "जी ने लेखक को सोचा था कि वहां उप-तत्व होने जा रहे थे तत्व बनाओ? " <car make="Ford" color="Red" /> काफी अधिक पठनीय है, इस बारे में कोई सवाल नहीं है कि व्हाइटस्पेस कैसे संभाला जाएगा आदि।

व्हाइटवेस हैंडलिंग नियमों को देखते हुए, मुझे विश्वास है कि यह एक्सएमएल डिजाइनरों का स्पष्ट इरादा था।


मैं गुण बनाम तत्वों के संबंध में अपने स्कीमा डिज़ाइन में निम्न दिशानिर्देशों का उपयोग करता हूं:

  • लंबे समय तक चलने वाले पाठ के लिए तत्वों का प्रयोग करें (आमतौर पर स्ट्रिंग या सामान्यीकृत स्ट्रिंग प्रकारों के)
  • किसी तत्व के लिए दो मानों (जैसे EventStartDate और eventEndDate) का समूहकरण करने पर विशेषता का उपयोग न करें। पिछले उदाहरण में, "ईवेंट" के लिए एक नया तत्व होना चाहिए जिसमें स्टार्टडेट और एंडडेट गुण हो सकते हैं।
  • व्यापार तिथि, दिनांक समय और संख्याएं (जैसे गणना, राशि और दर) तत्व होना चाहिए।
  • गैर-व्यावसायिक समय तत्व जैसे अंतिम अद्यतन, समाप्त होने पर गुण होना चाहिए।
  • हैश कोड और इंडेक्स जैसी गैर-व्यावसायिक संख्या विशेषता होनी चाहिए। * यदि तत्व जटिल होगा तो तत्वों का उपयोग करें।
  • गुणों का उपयोग करें यदि मान एक साधारण प्रकार है और दोहराना नहीं है।
  • एक्सएमएल: आईडी और एक्सएमएल: लैंग एक्सएमएल स्कीमा का संदर्भ देने वाले गुण होना चाहिए
  • तकनीकी रूप से संभव होने पर विशेषताओं को प्राथमिकता दें।

विशेषताओं के लिए प्राथमिकता यह है कि यह निम्नलिखित प्रदान करता है:

  • अद्वितीय (विशेषता कई बार प्रकट नहीं हो सकती है)
  • आदेश कोई फर्क नहीं पड़ता
  • उपर्युक्त गुण विरासत योग्य हैं (यह ऐसा कुछ है जो "सभी" सामग्री मॉडल वर्तमान स्कीमा भाषा में समर्थन नहीं करता है)
  • बोनस वे कम वर्बोज़ हैं और कम बैंडविड्थ का उपयोग करते हैं, लेकिन वास्तव में तत्वों पर विशेषताओं को प्राथमिकता देने का कोई कारण नहीं है।

मैंने तकनीकी रूप से संभव होने पर जोड़ा क्योंकि वहां कई बार गुणों का उपयोग संभव नहीं है। उदाहरण के लिए, विशेषता सेट विकल्प। उदाहरण के लिए उपयोग (स्टार्टडेट और एंडडेट) xor (startTS और endTS) वर्तमान स्कीमा भाषा के साथ संभव नहीं है

यदि एक्सएमएल स्कीमा "सभी" सामग्री मॉडल को प्रतिबंधित या विस्तारित करने की इजाजत देता है तो मैं शायद इसे छोड़ दूंगा


यह आपके उपयोग पर निर्भर हो सकता है। एक्सएमएल जो किसी डेटाबेस से उत्पन्न किए गए स्टैक्चर किए गए डेटा का प्रतिनिधित्व करने के लिए उपयोग किया जाता है, अंततः फील्ड मानों को विशेषताओं के रूप में रखा जा सकता है।

हालांकि एक संदेश परिवहन के रूप में उपयोग किया जाने वाला एक्सएमएल अक्सर अधिक तत्वों का उपयोग करके बेहतर होगा।

उदाहरण के लिए कहें कि हमारे पास उत्तर में प्रस्तावित एक्सएमएल था: -

<INVENTORY>
   <ITEM serialNumber="something" barcode="something">
      <Location>XYX</LOCATION>
      <TYPE modelNumber="something">
         <VENDOR>YYZ</VENDOR>
      </TYPE>
    </ITEM>
</INVENTORY>

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

   <ITEM serialNumber="something">
      <barcode encoding="Code39">something</barcode>
      <Location>XYX</LOCATION>
      <TYPE modelNumber="something">
         <VENDOR>YYZ</VENDOR>
      </TYPE>
   </ITEM>

मुद्दा यह है कि जब तक आप पत्थर में संरचना को ठीक करने के लिए नामस्थान के साथ किसी प्रकार का एक्सएसडी या डीटीडी नहीं बनाते हैं, तो आप अपने विकल्पों को खोलने के लिए सबसे अच्छी सेवा कर सकते हैं।

आईएमओ एक्सएमएल सबसे उपयोगी है जब इसे मौजूदा कोड को तोड़ने के बिना फ्लेक्स किया जा सकता है।


यह काफी हद तक वरीयता का मामला है। मैं डेटा के लिए समूह और गुणों के लिए तत्वों का उपयोग करता हूं जहां संभव हो, क्योंकि मैं इसे वैकल्पिक से अधिक कॉम्पैक्ट के रूप में देखता हूं।

उदाहरण के लिए मैं पसंद करता हूं .....

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
         <person name="Rory" surname="Becker" age="30" />
        <person name="Travis" surname="Illig" age="32" />
        <person name="Scott" surname="Hanselman" age="34" />
    </people>
</data>

...के बजाय....

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
        <person>
            <name>Rory</name>
            <surname>Becker</surname>
            <age>30</age>
        </person>
        <person>
            <name>Travis</name>
            <surname>Illig</surname>
            <age>32</age>
        </person>
        <person>
            <name>Scott</name>
            <surname>Hanselman</surname>
            <age>34</age>
        </person>
    </people>
</data>

हालांकि अगर मेरे पास डेटा है जो 20-30 वर्णों के अंदर आसानी से प्रतिनिधित्व नहीं करता है या इसमें कई उद्धरण या अन्य पात्र शामिल हैं जिन्हें भागने की आवश्यकता है तो मैं कहूंगा कि यह तत्वों को तोड़ने का समय है ... संभवतः सीडीटा ब्लॉक के साथ।

<?xml version="1.0" encoding="utf-8"?>
<data>
    <people>
        <person name="Rory" surname="Becker" age="30" >
            <comment>A programmer whose interested in all sorts of misc stuff. His Blog can be found at http://rorybecker.blogspot.com and he's on twitter as @RoryBecker</comment>
        </person>
        <person name="Travis" surname="Illig" age="32" >
            <comment>A cool guy for who has helped me out with all sorts of SVn information</comment>
        </person>
        <person name="Scott" surname="Hanselman" age="34" >
            <comment>Scott works for MS and has a great podcast available at http://www.hanselminutes.com </comment>
        </person>
    </people>
</data>

समय पर मेरा विश्वास करने के लिए गुण आसानी से मुश्किल हो सकते हैं। मैं हमेशा व्यक्तिगत रूप से उनसे दूर रहता हूं। तत्व दोनों पार्सर्स और उपयोगकर्ताओं द्वारा कहीं अधिक स्पष्ट और पठनीय / प्रयोग योग्य हैं।

केवल समय मैंने उन्हें कभी भी इस्तेमाल किया था, एक संपत्ति url के फ़ाइल एक्सटेंशन को परिभाषित करना था:

<image type="gif">wank.jpg</image> ...etc etc

मुझे लगता है कि अगर आपको पता है कि 100% विशेषता को विस्तारित करने की आवश्यकता नहीं है तो आप उनका उपयोग कर सकते हैं, लेकिन आप इसे कितनी बार जानते हैं।

<image>
  <url>wank.jpg</url>
  <fileType>gif</fileType>
</image>

हमारे हार्ड अर्जित ऑब्जेक्ट ओरिएंटेशन अंतर्ज्ञान का लाभ उठाने के बारे में कैसे? मुझे आमतौर पर यह लगता है कि यह एक वस्तु है और यह ऑब्जेक्ट की विशेषता है या किस ऑब्जेक्ट का जिक्र है, यह सोचने के लिए सीधे आगे है।

ऑब्जेक्ट्स के रूप में जो भी सहजता से समझ में आता है वह तत्वों के रूप में फिट होगा। इसके गुण (या गुण) गुणों के साथ xml या बाल तत्व में इन तत्वों के लिए गुण होंगे।

मुझे लगता है कि सरल ऑब्जेक्ट्स जैसे उदाहरण ऑब्जेक्ट ओरिएंटेशन एनालॉजी काम करता है यह पता लगाने के लिए कि कौन सा तत्व है और जो तत्व की विशेषता है।







xsd