Skip to content
Back to Blog
how-to-convert

XML को PLIST (Apple प्रॉपर्टी लिस्ट) में कैसे बदलें

2026-05-17 10 min read

मूल अंतर को समझना: XML बनाम PLIST

कुछ भी कन्वर्ट करने की कोशिश करने से पहले, यह समझना ज़रूरी है कि XML और Apple की प्रॉपर्टी लिस्ट (PLIST) मौलिक रूप से अलग चीजें हैं, भले ही वे एक जैसे दिखते हों। XML (eXtensible Markup Language) हर काम में माहिर है। यह एक ऐसी भाषा है जिसे इंसान और मशीन दोनों पढ़ सकते हैं, और इसकी ताकत इसके लचीलेपन में है। आप किसी भी तरह के डेटा को संरचित करने के लिए कस्टम टैग बना सकते हैं, वेब सर्विस रिस्पॉन्स और वेक्टर ग्राफिक्स से लेकर पूरे डॉक्यूमेंट स्कीमा तक। मुख्य बात यह है कि XML में किसी टैग के अंदर के साधारण टेक्स्ट के अलावा डेटा टाइप की कोई अवधारणा नहीं होती है। दूसरी ओर, Apple प्रॉपर्टी लिस्ट एक विशेषज्ञ है। यह एक विशिष्ट डेटा सीरियलाइज़ेशन फॉर्मेट है, जो JSON की तरह ही है, और इसे एक ही काम के लिए बनाया गया है: संरचित डेटा ऑब्जेक्ट को स्टोर करना। आप इसे macOS और iOS में हर जगह देखते हैं, जहाँ यह एप्लिकेशन सेटिंग्स, उपयोगकर्ता की प्राथमिकताएं, और प्रसिद्ध `Info.plist` जैसी बंडल जानकारी रखता है। एक PLIST फ़ाइल एक रूट ऑब्जेक्ट पर बनी होती है, जो आमतौर पर एक डिक्शनरी (`<dict>`) या एक ऐरे (`<array>`) होता है। सबसे महत्वपूर्ण अंतर—और अधिकांश कनवर्ज़न सिरदर्द का स्रोत—यह है कि PLISTs स्ट्रॉन्गली टाइप्ड होते हैं। उनमें `<string>`, `<integer>`, `<real>`, `<date>`, `<data>`, और `<boolean>` के लिए विशिष्ट टैग होते हैं। इसलिए, भले ही एक PLIST को XML फॉर्मेट में सहेजा गया हो, उसे Apple के सख्त नियमों (एक डॉक्यूमेंट टाइप डेफिनिशन, या DTD) का पालन करना चाहिए। कोई भी सामान्य XML फ़ाइल इसके योग्य नहीं होती। इसका मतलब है कि कनवर्ज़न सिर्फ सिंटैक्स की अदला-बदली नहीं है; यह एक लचीली, अनटाइप्ड संरचना से एक कठोर, टाइप्ड संरचना में अनुवाद है।

अर्थ संबंधी चुनौती: सीधा कनवर्ज़न अक्सर क्यों विफल होता है

एक सामान्य XML फ़ाइल को PLIST में बदलने में असली समस्या अर्थ की है। एक साधारण पार्सर सफल नहीं हो सकता क्योंकि वह XML डेटा के पीछे के *इरादे* को नहीं समझता। वह सिर्फ टैग और टेक्स्ट देखता है। किसी तीसरे पक्ष के सिस्टम से उपयोगकर्ता प्रोफ़ाइल का यह सामान्य उदाहरण लें: ```xml <user id="101"> <name>John Appleseed</name> <registered>true</registered> <logins>342</logins> </user> ``` इसे देखने वाला कोई भी व्यक्ति आसानी से अनुमान लगा सकता है कि `<user>` एक डिक्शनरी है, `<name>` एक स्ट्रिंग के लिए एक की (key) है, और `<logins>` एक संख्या के लिए एक की (key) है। लेकिन एक स्वचालित टूल को तुरंत कठिन सवालों का सामना करना पड़ता है। क्या `id="101"` एट्रिब्यूट को `id` नामक की (key) बनना चाहिए? उसे कैसे पता चलेगा कि टेक्स्ट `true` को PLIST के बूलियन टाइप `<true/>` से मैप करना है, न कि सिर्फ स्ट्रिंग `<string>true</string>` से? और रूट `<user>` टैग का क्या? क्या इसे टॉप-लेवल की (key) बनना चाहिए या पूरी तरह से हटा दिया जाना चाहिए? यह अस्पष्टता ही वह जगह है जहाँ अधिकांश स्वचालित कन्वर्टर्स विफल हो जाते हैं। एक जेनेरिक टूल को अनुमान पर निर्भर रहना पड़ता है। यह सुरक्षित रास्ता अपना सकता है और हर मान को एक स्ट्रिंग मान सकता है, या यह हार मान सकता है यदि XML में बहुत सारे एट्रिब्यूट्स या गहरी नेस्टिंग का उपयोग किया गया हो। यही कारण है कि आपको एक ऐसी फ़ाइल मिल सकती है जो तकनीकी रूप से एक वैध PLIST है, लेकिन जब आपको संख्याओं और बूलियन की आवश्यकता होती है तो वह स्ट्रिंग्स से भरी होती है—जो अक्सर बेकार से भी बदतर होती है क्योंकि यह बस आपकी एप्लिकेशन को तोड़ देगी। सबसे सफल कनवर्ज़न तब होते हैं जब स्रोत XML पहले से ही एक की-वैल्यू स्टोर जैसा दिखता है। किसी और चीज़ के लिए, आपको मैपिंग नियमों को स्वयं परिभाषित करने के लिए अधिक व्यावहारिक दृष्टिकोण की आवश्यकता है।

विधि 1: macOS पर कमांड-लाइन टूल्स का उपयोग करना

यदि आप macOS पर एक डेवलपर हैं, तो आपकी पहली प्रवृत्ति शायद कमांड-लाइन टूल का उपयोग करने की होगी। आपको जल्दी ही `plutil` मिल जाएगा, लेकिन इसकी भूमिका को अक्सर गलत समझा जाता है। यहाँ एक पेंच है: `plutil` एक जेनेरिक XML-से-PLIST कन्वर्टर नहीं है। यह एक PLIST *फॉर्मेट* कन्वर्टर है। इसे एक वैध प्रॉपर्टी लिस्ट को एक फॉर्मेट (जैसे XML या JSON) से दूसरे (जैसे बाइनरी) में बदलने के लिए डिज़ाइन किया गया है। इसका मतलब है कि आपकी इनपुट XML को *पहले से ही* एक वैध Apple XML प्रॉपर्टी लिस्ट होना चाहिए। यदि आपके पास एक फ़ाइल, `config.plist.xml` है, जो DTD का पालन करती है, तो आप इसे इस कमांड के साथ कॉम्पैक्ट बाइनरी फॉर्मेट में बदल सकते हैं: `plutil -convert binary1 -o config.plist config.plist.xml` या, यह सुनिश्चित करने के लिए कि यह आधुनिक XML फॉर्मेट में है, आप इसका उपयोग करेंगे: `plutil -convert xml1 -o config.plist config.plist.xml` `plutil` सत्यापन (validation) के लिए भी आवश्यक है। आपको हमेशा उपयोग करने से पहले फ़ाइल की अखंडता की जाँच करनी चाहिए: `plutil -lint yourfile.plist` यदि आपकी इनपुट XML Apple के PLIST फॉर्मेट में नहीं है, तो `plutil` बस एक एरर देगा। इससे निपटने के लिए, आप XSLT (eXtensible Stylesheet Language Transformations) का उपयोग करके एक शक्तिशाली दो-चरणीय प्रक्रिया अपना सकते हैं। पहले आप एक XSLT स्टाइलशीट (`transform.xslt`) लिखते हैं जो आपके कस्टम XML को उचित Apple PLIST XML फॉर्मेट में बदलने के नियम निर्धारित करती है। फिर, आप इसे लागू करने के लिए `xsltproc` जैसे टूल का उपयोग करते हैं: `xsltproc transform.xslt custom_data.xml > intermediate.plist.xml` उस `intermediate.plist.xml` फ़ाइल के साथ, आप फिर `plutil` का उपयोग करके इसे सत्यापित और कन्वर्ट कर सकते हैं। यह विधि पूरी सटीकता प्रदान करती है, लेकिन ईमानदारी से कहें तो, XSLT लिखना अधिकांश लोगों के लिए एक मजेदार दोपहर बिताने का विचार नहीं है। यह एक शक्तिशाली टूल है, लेकिन इसमें प्रतिबद्धता की आवश्यकता होती है।

विधि 2: कस्टम लॉजिक के लिए Python के साथ स्क्रिप्टिंग

जब कमांड-लाइन टूल्स बहुत कठोर होते हैं और XSLT ज़रूरत से ज़्यादा लगता है, तो Python एक सही संतुलन प्रदान करता है। यह अपनी शानदार मानक लाइब्रेरियों (`xml.etree.ElementTree` और `plistlib`) की बदौलत शक्ति और पठनीयता का उत्तम मिश्रण प्रदान करता है। एक स्क्रिप्ट का उपयोग करने से आपको कनवर्ज़न लॉजिक पर पूरा नियंत्रण मिलता है। आप किसी भी अजीब तरह से संरचित XML को पार्स कर सकते हैं, उसके एलिमेंट्स और एट्रिब्यूट्स के माध्यम से लूप कर सकते हैं, और एक Python डिक्शनरी या लिस्ट बना सकते हैं जो आपकी ज़रूरत के PLIST स्ट्रक्चर से पूरी तरह मेल खाती हो। एक बार जब आपके पास वह Python ऑब्जेक्ट हो जाता है, तो `plistlib` मॉड्यूल इसे सीधे आपके लिए एक `.plist` फ़ाइल में सीरियलाइज़ कर देगा। आइए उस यूज़र प्रोफ़ाइल XML पर फिर से नज़र डालें। यह Python स्क्रिप्ट दिखाती है कि इसे सही टाइप वाली PLIST में कैसे पार्स किया जाए: ```python import xml.etree.ElementTree as ET import plistlib # The source XML data xml_string = """ <user id="101"> <name>John Appleseed</name> <registered>true</registered> <logins>342</logins> </user> """ # Parse the XML string root = ET.fromstring(xml_string) # Build a Python dictionary with correct data types user_data = { 'userID': int(root.attrib['id']), 'name': root.find('name').text, 'isRegistered': root.find('registered').text.lower() == 'true', 'loginCount': int(root.find('logins').text) } # Write the dictionary to a .plist file with open('UserProfile.plist', 'wb') as fp: plistlib.dump(user_data, fp) print("UserProfile.plist has been created successfully.") ``` ध्यान दें कि यहाँ क्या हो रहा है: हम पूरी तरह से नियंत्रण में हैं। हम `id` का नाम बदलकर `userID` कर रहे हैं, स्पष्ट रूप से `int()` के साथ न्यूमेरिक स्ट्रिंग्स को इंटीजर में बदल रहे हैं, और स्ट्रिंग `"true"` को सही ढंग से बूलियन में पार्स कर रहे हैं। किसी भी गंभीर, दोहराए जाने वाले वर्कफ़्लो के लिए, यही सबसे अच्छा तरीका है। अनुमान लगाने वाले टूल्स के साथ खिलवाड़ न करें; एक ऐसी स्क्रिप्ट लिखें जो जानती हो कि वास्तव में क्या करना है।

विधि 3: त्वरित और सरल मामलों के लिए CocoConvert ऑनलाइन टूल

कभी-कभी आपको बस एक फ़ाइल को *अभी* कन्वर्ट करने की आवश्यकता होती है, बिना टर्मिनल खोले या स्क्रिप्ट लिखे। उन त्वरित, एक बार के कामों के लिए, एक ऑनलाइन टूल सबसे तेज़ रास्ता है। हमारा [XML से PLIST कन्वर्टर](/convert/xml-to-plist) ठीक इसी के लिए बनाया गया है। प्रक्रिया इससे सरल नहीं हो सकती। आप कन्वर्टर पर जाते हैं, फिर अपनी `.xml` फ़ाइल को सीधे पेज पर खींचकर छोड़ते (ड्रैग एंड ड्रॉप करते) हैं। हमारी सेवा तुरंत काम पर लग जाती है, XML की संरचना का विश्लेषण करती है और टैग और मानों को सही PLIST डिक्शनरी, कीज़ और डेटा टाइप में मैप करने के लिए स्मार्ट अनुमानों (heuristics) के एक सेट का उपयोग करती है। यह टेक्स्ट सामग्री से संख्याओं और बूलियन जैसी चीजों का अनुमान लगाने की पूरी कोशिश करता है। एक पल के बाद, आप बस "कन्वर्ट" बटन पर क्लिक करते हैं, और आपकी नई `.plist` फ़ाइल के लिए एक डाउनलोड लिंक दिखाई देता है। अब, यह स्पष्ट कर लें कि यह दृष्टिकोण कहाँ सबसे अच्छा काम करता है—और कहाँ नहीं। हमारा स्वचालित कन्वर्टर डेटा इंटरचेंज के लिए पहले से ही अच्छी तरह से संरचित XML, जैसे कि सरल कॉन्फ़िगरेशन फ़ाइलों के लिए शानदार है। हालाँकि, यदि आपका XML एक जटिल, एट्रिब्यूट-भारी और कस्टम नेमस्पेस वाला है, तो स्वचालित मैपिंग शायद आपके इरादे को पूरी तरह से न पकड़ पाए। आपको एक चपटी (flattened) संरचना मिल सकती है या आप पा सकते हैं कि सब कुछ डिफ़ॉल्ट रूप से एक स्ट्रिंग में बदल दिया गया है। उन भारी-भरकम कामों के लिए, कस्टम Python स्क्रिप्ट अभी भी आपका सबसे मजबूत समाधान है। हमारा ऑनलाइन टूल आम चीज़ों के लिए गति और सुविधा को प्राथमिकता देता है, और आप इसे विश्वास के साथ उपयोग कर सकते हैं यह जानते हुए कि हम एक घंटे के भीतर अपने सर्वर से सभी अपलोड और कन्वर्ट की गई फ़ाइलों को हटा देते हैं।

अपनी कन्वर्ट की गई PLIST फ़ाइल को सत्यापित करना और उपयोग करना

सिर्फ यह भरोसा न करें कि कनवर्ज़न काम कर गया। आपको इसे सत्यापित करना होगा। पहला कदम सिंटैक्स त्रुटियों की जाँच करना है। Mac पर, `plutil -lint` कमांड आपका सबसे अच्छा दोस्त है। `plutil -lint YourNewFile.plist` चलाने पर आपको तुरंत `OK` या एक विस्तृत त्रुटि संदेश मिलेगा जो आपको बताएगा कि समस्या ठीक कहाँ है। सिंटैक्स सत्यापन बहुत अच्छा है, लेकिन यह अर्थ संबंधी त्रुटियों को नहीं पकड़ेगा। उसके लिए, आपको वास्तव में डेटा को देखना होगा। इसके लिए सबसे अच्छा टूल Apple का Xcode है। बस `.plist` फ़ाइल खोलें (`File > Open...`), और Xcode इसे एक साफ, ग्राफिकल प्रॉपर्टी लिस्ट एडिटर में प्रस्तुत करेगा। यह व्यू आपको आसानी से पदानुक्रम (hierarchy) को ब्राउज़ करने और, सबसे महत्वपूर्ण, प्रत्येक मान का डेटा टाइप (स्ट्रिंग, नंबर, बूलियन, आदि) देखने देता है। Xcode के एडिटर में एक PLIST खोलने से तुरंत पता चल जाता है कि आपका `loginCount` एक नंबर है या, भयानक रूप से, एक स्ट्रिंग। इस साधारण विज़ुअल जाँच ने मेरे घंटों की डीबगिंग बचाई है। एक बार जब आपकी फ़ाइल सत्यापित और जाँची जाती है, तो आप इसे काम में लाने के लिए तैयार हैं। एक कन्वर्ट की गई PLIST एक MDM सेवा के लिए एक कॉन्फ़िगरेशन प्रोफ़ाइल, `~/Library/Preferences/` में किसी ऐप के लिए एक सेटिंग्स फ़ाइल, या आपके अपने एप्लिकेशन बंडल के लिए एक संशोधित `Info.plist` हो सकती है। यह जानना कि फ़ाइल कहाँ जा रही है और उसे किस स्कीमा का पालन करना है, एक सफल वर्कफ़्लो की कुंजी है। और अगर आपको कभी दूसरी दिशा में जाने की आवश्यकता हो, तो `plutil` आसानी से एक बाइनरी या XML PLIST को वापस इंसानों द्वारा पढ़े जा सकने वाले फॉर्मेट में बदल सकता है: `plutil -convert xml1 YourBinary.plist -o Readable.plist`।

Ready to convert?

Try it now — fast, secure, and private.

Convert Now →