सवाल विन्यास फाइलों के लिए एक्सएमएल, क्यों?


कॉन्फ़िगरेशन फ़ाइलों के लिए इतनी सारी परियोजनाएं एक्सएमएल का उपयोग क्यों करती हैं?


44


मूल


एक दिन, किसी ने एक्सएमएल के साथ अपनी विन्यास समस्या को हल करने का फैसला किया। अब उन्हें दो समस्याएं थीं। - B T
परियोजना क्यों पूछना बेहतर हो सकता है x, y, तथा z (यानी, jabberd) "इतनी सारी" परियोजनाओं का उपयोग क्यों करें इसके बजाय एक्सएमएल कॉन्फ़िगरेशन का उपयोग करें। आपके द्वारा प्राप्त किए गए उत्तरों को तथ्यों और अभिलेखों में ग्राउंड किया जा सकता है, हालांकि यह अभी भी खतरनाक रूप से "कॉन्फ़िगरेशन फ़ाइलों के लिए एक्सएमएल का उपयोग करने में क्या ट्रेडऑफ शामिल है" के करीब है, जो बहुत ही व्यक्तिपरक होगा। - Iiridayn


जवाब:


यह एक महत्वपूर्ण सवाल है।

अधिकतर विकल्प (जेएसओएन, वाईएएमएल, आईएनआई फाइलें) हैं आसान एक्सएमएल से पार्स करने के लिए।

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

फिर भी, कुछ लोग कहेंगे कि एक्सएमएल का JSON या पायथन पर कुछ फायदा है।

एक्सएमएल के बारे में क्या महत्वपूर्ण है कि एक एक्सएमएल सिंटैक्स की "सार्वभौमिकता" वास्तव में किसी अनुप्रयोग के लिए कॉन्फ़िगरेशन फ़ाइल लिखते समय बहुत अधिक लागू नहीं होती है। चूंकि कॉन्फ़िगरेशन फ़ाइल की पोर्टेबिलिटी कोई फर्क नहीं पड़ता है, इसलिए कुछ पायथन लोग पाइथन में अपनी कॉन्फ़िगरेशन फ़ाइलों को लिखते हैं।


संपादित करें

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

मैंने सुना है कि लोग कहते हैं कि "कोई" कॉन्फ़िगरेशन फ़ाइल के माध्यम से आपके ऐप को हैक कर सकता है। यह "कोई" कौन है? Sysadmin? डीबीए? निर्माता? कॉन्फ़िगरेशन फ़ाइलों तक पहुंच के साथ बहुत सारे रहस्यमय "किसी" नहीं हैं।

और जो भी बेईमानी प्रयोजनों के लिए पाइथन कॉन्फ़िगरेशन फ़ाइल को हैक कर सकता है वह शायद कीलॉगर्स, नकली प्रमाणपत्र या अन्य गंभीर खतरों को स्थापित कर सकता है।


38



एक विन्यास फाइल की पोर्टेबिलिटी कोई फर्क नहीं पड़ता, सच है। लेकिन यह महत्वपूर्ण है कि कॉन्फ़िगरेशन भाषा का डोमेन सुरक्षा कारणों से प्रतिबंधित हो; अधिकांश कॉन्फ़िगरेशन आवश्यकताओं के लिए एक पूर्ण उड़ा सामान्य उद्देश्य वाली भाषा बहुत व्यापक है, और उन मामलों में एक अनावश्यक सुरक्षा जोखिम है। - bignose
@bignose कॉन्फ़िगरेशन तक पहुंच "अधिकांश कॉन्फ़िगरेशन ज़रूरतों" में स्रोत का उपयोग इंगित करता है। शेष मामलों में, भाषा का एक श्वेतसूची वाला सबसेट बनाना पर्याप्त होना चाहिए (यानी, तार, परिभाषित चर, वैध व्याकरण का सबसेट भी स्वीकार कर सकते हैं)। YAGNI। - Iiridayn
@ बिग्नोस पुराना विषय लेकिन जो पाइथन दर्शन के चेहरे पर उड़ता है, जिसे मैं मानता हूं। "उपयोगकर्ता पर भरोसा करें।" मूर्खों को भर्ती नहीं करना आपको लुसी भाषा विकल्पों के साथ स्वयं से बचाने की कोशिश करने से अधिक सुरक्षित रखेगा। - Erik Reppen
@Iiridayn एक मामूली सुरक्षा चिंता है, लेकिन मैं मानता हूं कि परिप्रेक्ष्य में रखना काफी महत्वपूर्ण है। यदि आपके पास पाइथन में लिखित एक विशेषाधिकार प्राप्त प्रोग्राम है जो पाइथन कोड फ़ाइलों को अनधिकृत उपयोगकर्ताओं से कॉन्फ़िगरेशन फ़ाइलों के रूप में चलाता है, तो उनके लिए केवल सीमित कार्यों का कार्य करने का इरादा है, यह मनमानी कमांड निष्पादन शोषण के साथ एक छोटा स्थानीय विशेषाधिकार वृद्धि है। सॉफ़्टवेयर के विशाल बहुमत पर लागू नहीं है, लेकिन सुरक्षा लोग वास्तव में पागल हो जाते हैं और जब संभव हो तो सिस्टम के हर टुकड़े को कम से कम दुरुपयोग करने के लिए बहस करना पसंद करते हैं, कभी-कभी शायद बहुत उत्सुकता से। - mtraceur


  1. एक्सएमएल पार्स करना आसान है। अधिकांश भाषाओं में उपलब्ध कई लोकप्रिय, हल्के, फीचरफुल, और / या मुफ्त एक्सएमएल पार्सिंग लाइब्रेरी हैं।
  2. एक्सएमएल पढ़ने के लिए आसान है। यह एक बहुत ही मानव-पठनीय मार्कअप भाषा है, इसलिए मनुष्यों के साथ-साथ लिखने के लिए मनुष्यों के लिए लिखना आसान है।
  3. एक्सएमएल अच्छी तरह से निर्दिष्ट है। हर कोई और उसका कुत्ता जानता है कि सभ्य एक्सएमएल कैसे लिखना है, इसलिए वाक्यविन्यास के बारे में कोई भ्रम नहीं है।
  4. एक्सएमएल लोकप्रिय है। कहीं भी, कुछ महत्वपूर्ण लोगों ने इस विचार को धक्का देना शुरू कर दिया कि एक्सएमएल "भविष्य" था, और बहुत से लोगों ने इसे खरीदा।
  5. एक्सएमएल एक द्विदिश प्रारूप है। वह सफेद जगह, टिप्पणियां, और आदेश संरक्षित हैं। फ़ॉर्मेटिंग को संरक्षित करते समय आप प्रोग्रामेटिक रूप से लोड, बदल सकते हैं और फिर इसे सहेज सकते हैं। यह उन उपकरणों के लिए महत्वपूर्ण है जो उपयोगकर्ता अपने अनुप्रयोगों को कॉन्फ़िगर करने के लिए उपयोग कर सकते हैं। एक्सएमएल मूल रूप से बंद होने के कारणों में से एक है (दुनिया अधिक तकनीकी बन गई है इसलिए यह एक आवश्यकता से कम है)।
  6. एक्सएमएल में वैकल्पिक स्कीमा सत्यापन है। उपकरण और जटिल विन्यास प्रारूपों के लिए महत्वपूर्ण है।
  7. एक्सएमएल में नेमस्पेस हैं। यह पार्सिंग को प्रभावित करने के साथ अन्य कॉन्फ़िगरेशन या एनोटेशन को एम्बेड करने की अनुमति देता है। अन्य कॉन्फ़िगरेशन प्रारूपों में यह आमतौर पर हैक विशेष टिप्पणियों या संपत्ति के नाम के साथ किया जाता है।

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


30



मुझे लगता है कि सभी बिंदु सामान्य रूप से एक्सएमएल के वैध फायदे हैं; हालांकि, मुझे विन्यास फाइलों के संबंध नहीं दिखते हैं। कई मामलों में एक साधारण आईएनआई फ़ाइल कॉन्फ़िगरेशन के लिए करेगी, जो पार्स करना आसान होगा, और XML से लिखना और पढ़ना बहुत आसान होगा। - Dirk Vollmar
@ डिवो - आईएनआई फाइलें बहुत ही विंडोज-केंद्रित हैं, और विंडोज़ पर अन्य प्लेटफ़ॉर्म की तुलना में बेहतर समर्थित हैं। यूनिक्स में यह स्वयं का यूनिक्स-केंद्रित कॉन्फ़िगरेशन फ़ाइल स्वरूप है, जो अन्य प्लेटफार्मों की तुलना में यूनिक्स पर बेहतर समर्थित है। एक्सएमएल का हर जगह समान रूप से समर्थित होने का लाभ है। इसके अलावा, एक्सएमएल अधिक पदानुक्रमित संरचना की अनुमति देता है - आईएनआई फाइल एक्सएमएल की तरह घोंसले की अनुमति नहीं देती है। - Chris Lutz
मैं अंक 1, 3, और 4 के साथ सहमत हूं। लेकिन "एक्सएमएल पढ़ने में आसान है, यह एक बहुत ही मानव-पठनीय मार्कअप भाषा है, इसलिए मनुष्यों के लिए लिखना आसान है"; निश्चित रूप से आप जस्ट? क्या यह "मानव" शब्द की कुछ अलग परिभाषा है जिसे मैं वर्तमान में अनजान हूं? - bignose
यह मुझे आश्चर्यचकित करने में कभी विफल नहीं होता है कि <property विशेषता "foo"> bar </ property> कुछ लोगों को पढ़ने के लिए कितना कठिन है। यह बस फिर से शापित मेट्रिक प्रणाली की तरह है! - annakata
दरअसल मुझे लगता है कि एक्सएमएल पार्स करना मुश्किल है। मैं इसे मानव पठनीय प्रारूप के रूप में भी नहीं देखता हूं। - elcuco


क्योंकि एक्सएमएल शांत और एंटरप्राइज़ लगता है।

संपादित करें: मुझे एहसास नहीं हुआ कि मेरा जवाब इतना अस्पष्ट था, जब तक एक टिप्पणीकर्ता ने परिभाषा का अनुरोध नहीं किया enterpriseyविकिपीडिया का हवाला देते हुए:

[...] शब्द "एंटरप्राइसी" का उद्देश्य "छोटे संगठनों के लिए ओवरकिल" की चिंता से परे जाना है, यह संकेत देने के लिए कि सॉफ्टवेयर बड़े संगठनों और सरल, सिद्ध समाधानों के लिए भी जटिल है।

मेरा मुद्दा यह है कि एक्सएमएल एक buzzword है और इस तरह से overused किया जा रहा है। अन्य राय के बावजूद, एक्सएमएल पार्स करना आसान नहीं है (केवल libxml2 देखें, इसका gzipped स्रोत पैकेज वर्तमान में 3 एमबी से अधिक है)। अनावश्यकता की मात्रा के कारण हाथ से लिखना भी परेशान है। उदाहरण के लिए, विकिपीडिया एक्सएमएल विन्यास सूचीबद्ध करता है की लोकप्रियता में कमी के कारणों में से एक के रूप में jabberd अन्य कार्यान्वयन के पक्ष में।


24



डाउनवॉट्स क्यों? एक व्यंग्यात्मक उत्तर होने के बावजूद, यह एक काफी वैध कारण है कि एक्सएमएल इतना लोकप्रिय क्यों है। एकमात्र कारण नहीं, निश्चित रूप से, लेकिन एक महत्वपूर्ण है। - Chris Lutz
समर्थन के लिए धन्यवाद, क्रिस। - avakar
ऐसा लगता है कि यह एक्सएम को बाश करने के लिए भी लोकप्रिय है। इसके बजाय आप इसके स्थान पर क्या उपयोग करेंगे, उदा। ऐप कॉन्फ़िगरेशन या डेटा ट्रैनर के लिए? लोग शायद ही कभी विकल्प प्रदान करते हैं। यह आपकी विशिष्ट स्थिति में आपके विशिष्ट उपयोग के लिए थोड़ा वर्बोज़ हो सकता है। लेकिन मैं इसे हिट करने, इसे बदलने के लिए, इसे पूछने और इसे सत्यापित करने के लिए उपकरण रखने में उस हिट को ले जाऊंगा। - JonoW
JonoW, एक्सएमएल निश्चित रूप से वैध उपयोग है। मैं कड़ाई से विन्यास फाइलों के बारे में बात कर रहा हूँ। मेरा मानना ​​है कि ज्यादातर मामलों में, key=value न केवल पर्याप्त है, बल्कि पार्स करने के लिए और अधिक पठनीय और आसान है। - avakar
avakar, आप विचार सरल सेटिंग्स के लिए काम करता है लेकिन मैं तर्क दूंगा कि एक्सएमएल बेहतर है क्योंकि यह अधिक विस्तार योग्य है। कहें, उदाहरण के लिए, आपके पास एक ही नाम के साथ ऑब्जेक्ट्स की एक सूची हो सकती है (कहें, निर्देशिकाओं की एक सूची) - क्या आप बस एक ही मूल्य को कई बार कॉल करेंगे? एक संख्या संलग्न करें? मुझे जो मिल रहा है वह यह है कि एक्सएमएल एक मानक है जिसे आसानी से पालन किया जा सकता है। - Kenny Mann


एक्सएमएल एक अच्छी तरह से विकसित और अपनाया मानक है, जो स्वामित्व विन्यास स्वरूपों की तुलना में इसे पढ़ने और समझना आसान बनाता है।

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

नेट: http://msdn.microsoft.com/en-us/library/system.xml.serialization.aspx

पीएचपी: http://us.php.net/serialize

अजगर: http://docs.python.org/library/pickle.html

जावा: http://java.sun.com/developer/technicalArticles/Programming/serialization/


13



अचार और एक्सएमएल के बीच संबंध क्या है? - maazza


आपके उत्तरों के लिए धन्यवाद। यह सवाल, जैसा कि बेवकूफ के रूप में यह पहली नज़र में लग सकता है इतना मूर्ख नहीं था :)

व्यक्तिगत रूप से मुझे कॉन्फ़िगरेशन फ़ाइलों के लिए एक्सएमएल पसंद नहीं है, मुझे लगता है कि लोगों को पढ़ने और बदलने के लिए मुश्किल है, और कंप्यूटरों को पार्स करना मुश्किल है क्योंकि यह इतना सामान्य और शक्तिशाली है।

आईएनआई फाइल या जावा प्रोपेरी फाइलें केवल सबसे बुनियादी अनुप्रयोगों के लिए ठीक हैं जिन्हें घोंसले की आवश्यकता होती है। उन प्रारूपों में घोंसले जोड़ने के लिए सामान्य समाधान इस तरह दिखते हैं:

level1.key1=value
level1.key2=value
level2.key1=value

एक सुंदर दृष्टि नहीं, बहुत सारे अनावश्यकता और नोड्स के बीच चीजों को स्थानांतरित करना मुश्किल है।

JSON एक खराब भाषा नहीं है, लेकिन यह कंप्यूटर के लिए पार्स (यह वैध जावास्क्रिप्ट) के लिए आसान होने के लिए डिज़ाइन किया गया है, इसलिए यह कॉन्फ़िगरेशन फ़ाइलों के लिए जंगली रूप से उपयोग नहीं किया जाता है।

JSON इस तरह दिखता है:

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

मेरी राय में, यह अल्पविराम और उद्धरण के साथ भी घिरा हुआ है।

YAML विन्यास फाइलों के लिए अच्छा है, यहां एक नमूना है:

invoice: 34843
date   : 2001-01-23
bill-to: &id001
    given  : Chris
    family : Dumars

हालांकि, मुझे इसके वाक्यविन्यास को बहुत पसंद नहीं है, और मुझे लगता है कि स्कोप को परिभाषित करने के लिए व्हाइटस्पेस का उपयोग करके चीजों को थोड़ा नाजुक बनाते हैं (सोचें कि एक ब्लॉक को एक अलग घोंसले के स्तर पर चिपकाएं)।

कुछ दिन पहले मैंने कॉन्फ़िगरेशन फ़ाइल के लिए अपनी भाषा लिखना शुरू कर दिया था, मैंने इसे डब किया था Swush

यहां कुछ नमूने दिए गए हैं: एक साधारण कुंजी-मूल्य जोड़े के रूप में:

key:value
key:value2
key1:value3

या एक अधिक जटिल और टिप्पणी के रूप में

server{
    connector{
         protocol : http // HTTP or BlahTP
         port : 8080     # server port
         host : localhost /* server host name*/
    }

    log{
        output{
             file : /var/log/server.log
             format : %t%s
        }
    }
}

स्वश ऊपर दिए गए सरल रूप में या उद्धरणों में स्ट्रिंग का समर्थन करता है - जो तारों के अंदर सफेद जगहों और यहां तक ​​कि न्यूलाइन की अनुमति देता है। मैं जल्द ही सरणी जोड़ने जा रहा हूं, जैसे कुछ:

name [1 2 b c "Delta force"]

जावा कार्यान्वयन है, लेकिन अधिक कार्यान्वयन का स्वागत है। :)। अधिक जानकारी के लिए साइट की जांच करें (मैंने इसमें से अधिकांश को कवर किया है, लेकिन जावा एपीआई कुछ दिलचस्प विशेषताएं प्रदान करता है जैसे चयनकर्ता)


9



यदि आप एक सामान्य कॉन्फ़िगरेशन पार्सर करने का प्रयास कर रहे हैं, तो हो सकता है कि आप कोलन को बराबर चिह्न में बदल सकें। इस तरह आप कई अन्य मौजूदा कॉन्फ़िगरेशन फ़ाइलों को भी पार्स करने में सक्षम होंगे। - avakar
यह एक अच्छा मुद्दा है, और मैंने इसके बारे में सोचा। लेकिन मुझे लगता है कि कुंजी: मूल्य कुंजी = मान पर विचार करने योग्य है: कनेक्टर {प्रोटोकॉल: http // HTTP या BlahTP पोर्ट: 8080 # सर्वर पोर्ट होस्ट: localhost / * सर्वर होस्ट नाम * /} बनाम: कनेक्टर {प्रोटोकॉल = http / / HTTP या BlahTP पोर्ट = 8080 # सर्वर पोर्ट होस्ट = localhost / * सर्वर होस्ट नाम * /} मैं किसी भी तरह पहले बेहतर पसंद है, आपको क्या लगता है? - Omry Yadan
बाहर, टिप्पणियां कोड नमूने के लिए वास्तव में खराब हैं। - Omry Yadan
यह libconfig में पहले से मौजूद है। - Coyote21
यह एक बहुत लंबा "जवाब" है, लेकिन यह सवाल का जवाब नहीं देता है। यह सिर्फ खुद को पंप करने से पहले विभिन्न डेटा प्रारूपों के समूह की आलोचना करता है। - Quentin


एक अन्य बिंदु, यदि आपके कॉन्फ़िगरेशन फ़ाइल का वर्णन करने के लिए आपके पास XSD (स्कीमा फ़ाइल) है, तो आपके एप्लिकेशन के लिए कॉन्फ़िगरेशन फ़ाइल को सत्यापित करने के लिए यह छोटा है।


8



कोई भी स्कीमा आपको यह लाभ लाएगी। एक्सएसडी एकमात्र स्कीमा भाषा नहीं है। - bortzmeyer
एक्सएसडी एकमात्र स्कीमा भाषा नहीं है - विकल्प क्या हैं? - Gill Bates


चूंकि XML को पार्स करना अपेक्षाकृत आसान है, और यदि आपकी स्कीमा स्पष्ट रूप से निर्दिष्ट है, तो कोई भी उपयोगिता आसानी से जानकारी को पढ़ और लिख सकती है।


3



हमें कॉन्फ़िगरेशन के लिए उपयोगिताओं की आवश्यकता क्यों है? कॉन्फ़िगरेशन उपयोगिता थी। अब सी # और जावा में यह एक अजीब अभिशाप है। - Erik Reppen


खैर .., एक्सएमएल एक सामान्य उद्देश्य विनिर्देश है जो वर्णन, घोंसला वाली जानकारी और कुछ के बारे में डेटा रख सकता है। और कई एपीआई और सॉफ्टवेयर हैं जो इसे पार्स कर सकते हैं और इसे पढ़ सकते हैं।

इसलिए औपचारिक तरीके से कुछ वर्णन करना बहुत आसान है जो क्रॉस प्लेटफॉर्म और एप्लिकेशन ज्ञात है।


2



वाह! लेखन के दौरान 5 उत्तरों: एस प्रभावशाली - Saleh Al-Zaid