# XML फ़ॉर्मैटर — सजाइए, दबाकर सपाट कीजिए, या JSON बनाइए

पढ़ने के लिए सजाया गया XML या भेजने के लिए दबाकर सपाट किया गया XML, और दोनों तरफ़ JSON में बदला हुआ। इनमें से कुछ भी किसी और के सर्वर में पेस्ट नहीं होता।

> XML को फ़ॉर्मैट, इंडेंट और मिनिफ़ाई कीजिए, और XML को JSON या JSON को XML में बदलिए। पार्सर आपके ब्राउज़र में चलता है और कुछ भी अपलोड नहीं होता, इसलिए कोई फ़ीड, इनवॉइस या कॉन्फ़िग फ़ाइल आपकी डिवाइस से बाहर नहीं जाती।

यह पेज एक इंटरैक्टिव टूल है जो पूरी तरह आपके ब्राउज़र में चलता है, https://abox.tools/hi/xml-formatter/ पर — आप इसे जो भी देते हैं, वह कहीं अपलोड नहीं होता। आगे वह सब कुछ है जो यह पेज इस टूल के बारे में शब्दों में कहता है; इसे इस्तेमाल करने के लिए यह पता खोलें।

## यह टूल XML और JSON फ़ाइलें **कभी अपलोड नहीं करता**। यहाँ कोई सर्वर है ही नहीं।

फ़ॉर्मैट करना और बदलना एक स्ट्रिंग पर की गई गणित है, और वह यहीं, इसी पेज पर होती है। पार्सर हाथ से लिखा हुआ है और `src/shared/parse-xml.js` में है, इसके अलावा कुछ नहीं। इस टूल में किसी भी तरह की नेटवर्क सुविधा है ही नहीं — न कुछ लाने को, न कुछ भेजने को — और यहाँ इसका वज़न “XML” शब्द से लगने वाले वज़न से ज़्यादा है: इस फ़ॉर्मैट में जो आता है वह आम तौर पर एक इनवॉइस, एक बैंक स्टेटमेंट, एक मेडिकल रिकॉर्ड, या हेडर में किसी के क्रेडेंशियल लिए हुए SOAP रिक्वेस्ट होती है।

- ✗ कोई अपलोड नहीं
- ✗ कोई खाता नहीं
- ✗ साइज़ की कोई सीमा नहीं
- ✓ ऑफ़लाइन चलता है
- ✓ ओपन सोर्स

## XML को अपलोड किए बिना कैसे फ़ॉर्मैट करें

1. **काम चुनिए।** दो टैब, एक बॉक्स: *फ़ॉर्मैट* XML को सजाता है या दबाकर सपाट करता है; *बदलें* उसे JSON बनाता है, या JSON को वापस XML। अभी-अभी जो XML आपने सजाया है वही वह XML है जिसे आप बदलते हैं, दो बार पेस्ट किए बिना।
2. **पेस्ट कीजिए, या फ़ाइल छोड़िए।** जो कुछ आप चुनकर कॉपी कर सकते हैं वह सब चलता है, और सिलेक्टर पर छोड़ी गई `.xml`, `.svg`, `.rss` या `.xsd` फ़ाइल को आपका अपना ब्राउज़र पढ़कर बॉक्स में डाल देता है — छोड़ने के लिए अपलोड वाला कोई कदम है ही नहीं।
3. **इंडेंट चुनिए, या दबाकर सपाट कीजिए।** दो स्पेस, चार, या एक टैब। दबाकर सपाट करना वही दस्तावेज़ है, बस हर वह स्पेस हटाकर जो सिर्फ़ पढ़ने के लिए था, और नतीजा बताता है कि इससे कितने बाइट बचे।
4. **गड़बड़ी वहीं पढ़िए जहाँ गड़बड़ी है।** यहाँ नाकाम होने वाला पार्सर “लाइन 1 पर गड़बड़ी” कहने के बजाय, जो एक ब्राउज़र एक ही बार में पढ़े गए दस्तावेज़ के बारे में कहता है, यह बताता है कि *कौन-सा टैग* कभी बंद नहीं हुआ और वह किस लाइन और किस कॉलम पर है।
5. **नतीजा ले जाइए।** कॉपी कीजिए, या फ़ाइल के रूप में डाउनलोड कीजिए, जिसका नाम उसी फ़ॉर्मैट पर होगा जिसमें वह निकला।

## बॉक्स में और भी टूल

- [टेक्स्ट डिफ़](https://abox.tools/hi/text-diff/): दो टेक्स्ट भीतर, हर फ़र्क निशान लगाकर बाहर, पंक्ति-दर-पंक्ति और शब्द-दर-शब्द। कुछ भी किसी और के सर्वर में चिपकाया नहीं जाता।
- [Base64 एनकोडर-डिकोडर](https://abox.tools/hi/base64/): Base64, परसेंट एनकोडिंग, HTML एंटिटी, हेक्स और बैकस्लैश एस्केप, दोनों दिशाओं में। कुछ भी किसी और के सर्वर में चिपकाया नहीं जाता।
- [टेक्स्ट और फ़ाइलें साझा करें](https://abox.tools/hi/share-text/): साझा की गई चीज़ इसी खुले टैब में रहती है। पाठक उसे एन्क्रिप्टेड रूप में सीधे आपके ब्राउज़र से पाते हैं, और टैब बंद करते ही सब खत्म - किसी सर्वर पर कुछ नहीं रहता।
- [QR और बारकोड जनरेटर](https://abox.tools/hi/qr-barcode/): टाइप कीजिए, और वह कोड बन जाता है। बनाने के लिए कुछ भी कहीं नहीं भेजा जाता।

## सवाल

### क्या मेरा XML कहीं अपलोड होता है?

नहीं। इस पेज का पार्सर और प्रिंटर ऐसे फ़ंक्शन हैं जो आपके अपने ब्राउज़र में, आपके अपने हार्डवेयर पर चलते हैं। इस टूल में किसी भी तरह की नेटवर्क सुविधा नहीं है — यह कभी कुछ मँगाता नहीं और कभी कुछ भेजता नहीं — और पेज की `Content-Security-Policy` में वे सारे पते लिखे हैं जिनसे यह संपर्क कर सकता है, जिनमें से एक भी हमारा नहीं है। XML के मामले में यह इस फ़ॉर्मैट की शोहरत से कहीं ज़्यादा मायने रखता है: इसमें जो आता है वह आम तौर पर एक इनवॉइस, एक बैंक स्टेटमेंट, एक मेडिकल रिकॉर्ड, या हेडर में क्रेडेंशियल लिए हुए SOAP रिक्वेस्ट होती है।

### क्या यह बाहरी एंटिटी हल करता है?

नहीं, और बंद करने को कुछ है भी नहीं। बाहरी एंटिटी हल करना ही वह तरीका है जिससे किसी XML पार्सर को उसी मशीन की फ़ाइलें पढ़ाने के लिए बहलाया जाता है जिस पर वह चल रहा है — वह हमला जिसे आम तौर पर XXE लिखा जाता है — और `src/shared/parse-xml.js` हाथ से लिखा हुआ रीडर है जिसमें एंटिटी हल करना है ही नहीं। आपका टेक्स्ट ब्राउज़र के अपने `DOMParser` को भी कभी नहीं दिया जाता। कोई `DOCTYPE` बिना कभी चले आगे बढ़ जाता है।

### XML को JSON में बदलने पर क्या खोता है?

मिले-जुले कंटेंट का क्रम, टिप्पणियाँ, और एट्रिब्यूट तथा चाइल्ड एलिमेंट का फ़र्क — आखिरी वाला मिटता नहीं, बस नरम पड़ जाता है, क्योंकि एट्रिब्यूट ऐसा मेंबर बन जाता है जिसका नाम `@` से शुरू होता है। किसी एलिमेंट का अपना टेक्स्ट, जब उसे किसी और के साथ रहना पड़े, `#text` बन जाता है, और दोहराए गए चाइल्ड एक ऐरे बन जाते हैं। हर वैल्यू स्ट्रिंग ही रहती है: XML में टाइप होते ही नहीं, और यह तय करना कि `8080` एक संख्या थी, जानकारी गढ़ना होगा।

### JSON को XML में बदलने पर क्या खोता है?

खाली ऑब्जेक्ट, खाली ऐरे और खाली स्ट्रिंग का फ़र्क, जो तीनों एक खाली एलिमेंट बन जाते हैं, और हर वैल्यू का टाइप, क्योंकि XML में टाइप होते ही नहीं। ऐरे दोहराया गया एलिमेंट बन जाता है, जो वापस पढ़े जाने वाली इकलौती शक्ल है, और जिस key को कोई एलिमेंट नाम सँभाल नहीं सकता उसके असुविधाजनक अक्षर बदल दिए जाते हैं, बजाय ऐसा दस्तावेज़ निकालने के जिसे कोई पार्सर पढ़ेगा ही नहीं।

### क्या यह SVG, RSS फ़ीड या POM फ़ाइल फ़ॉर्मैट कर सकता है?

हाँ। तीनों XML हैं, और यह XML पढ़ता है, उसकी कोई खास बोली नहीं। इस तरह सजाया गया SVG हाथ से बदलना आसान होता है; RSS या Atom फ़ीड आम तौर पर दबाकर सपाट किया हुआ ही भेजा जाता है और तब तक पढ़ा नहीं जा सकता जब तक कोई उसे खोल न दे। कैसे सजाया गया है, इससे दस्तावेज़ का मतलब ज़रा भी नहीं बदलता।

### क्या दोबारा इंडेंट करने से XML का मतलब बदल जाता है?

जिस दस्तावेज़ के एलिमेंट दूसरे एलिमेंट रखते हैं, उसमें नहीं। जहाँ फ़र्क पड़ सकता है वह है टेक्स्ट: शब्द रखने वाले एलिमेंट के भीतर की खाली जगह उसी टेक्स्ट का हिस्सा होती है, इसलिए जिस एलिमेंट में सिर्फ़ टेक्स्ट है उसे खोलने के बजाय एक ही लाइन पर छोड़ दिया जाता है। `CDATA` हिस्से बिलकुल वैसे ही कॉपी होते हैं जैसे थे।

### ब्राउज़र का अपना XML पार्सर ही क्यों न इस्तेमाल करें?

क्योंकि दस्तावेज़ टूटा हो तो वह क्या कहता है। `DOMParser` एक एरर दस्तावेज़ लौटाता है जिसके शब्द हर ब्राउज़र में अलग होते हैं और अक्सर बात “लाइन 1 पर गड़बड़ी” पर आकर रुक जाती है। हाथ से लिखा रीडर बता सकता है कि कौन-सा टैग कभी बंद नहीं हुआ, और वह कहाँ खुला था, और असल में आपको यही जानना था। बाहरी एंटिटी हल न करना दूसरी वजह है।

### फ़ाइल कितनी बड़ी हो सकती है?

यहाँ कोई सीमा रखी ही नहीं गई, क्योंकि उसके लिए पैसे देने वाला कोई सर्वर नहीं है। असली छत आपकी अपनी डिवाइस है: कुछ मेगाबाइट XML ठीक रहता है, और बहुत लंबे दस्तावेज़ में पेज आपसे कीबोर्ड छीनने के बजाय आपके टाइप करने में ठहराव का इंतज़ार करता है और फिर दोबारा फ़ॉर्मैट करता है।

### क्या यह मुफ़्त है, और क्या खाता चाहिए?

यह मुफ़्त है, और कोई खाता नहीं, कोई साइन-इन नहीं, कोई ट्रायल नहीं और आप कितना पेस्ट करें इसकी कोई सीमा नहीं। साइट पर विज्ञापन हैं, उन्हीं से इसका खर्च चलता है; विज्ञापनों को आपके टेक्स्ट के बारे में कुछ नहीं दिया जाता।

### क्या यह ऑफ़लाइन चलता है?

हाँ। पेज एक बार लोड कीजिए, फिर इंटरनेट काट दीजिए और यह चलता रहता है। यही सबसे आसान तरीका भी है यह साबित करने का कि कुछ अपलोड नहीं हो रहा: जो टूल आपका XML फ़ॉर्मैट करने के लिए बाहर भेजता, वह तार निकालते ही रुक जाता।

## प्राइवेसी का यह दावा कैसे जाँचा जा सकता है

- **आप जो पेस्ट करते हैं उसके जाने की कोई जगह नहीं है।** Content-Security-Policy में वे सारे पते लिखे हैं जिनसे यह पेज संपर्क कर सकता है, और उनमें से एक भी हमारा नहीं है। यहाँ ऐसा कोई एंडपॉइंट नहीं है जहाँ पेस्ट की गई इनवॉइस इकट्ठी की जा सके, और होता भी तो कोड में ऐसा कुछ नहीं है जो उसे वहाँ भेजे।
- **यहाँ कुछ भी कहीं से कुछ नहीं लाता।** पूरे `src/` में कहीं कोई `fetch`, कोई `XMLHttpRequest` और कोई `sendBeacon` नहीं है। पार्सर और प्रिंटर इसी पेज के फ़ंक्शन हैं जो एक स्ट्रिंग लेते हैं और एक स्ट्रिंग लौटाते हैं।
- **बाहरी एंटिटी कभी हल नहीं की जातीं।** जिसमें बाहरी एंटिटी हो, ऐसा `DOCTYPE` ही वह तरीका है जिससे किसी XML पार्सर को उसी मशीन की फ़ाइल पढ़ाने के लिए बहलाया जाता है जिस पर पार्सिंग हो रही है, और यह इस फ़ॉर्मैट का सबसे पुराना छेद है। `src/shared/parse-xml.js` हाथ से लिखा हुआ रीडर है जिसमें एंटिटी हल करने की व्यवस्था है ही नहीं — बंद नहीं की गई, मौजूद ही नहीं — और यह पेज आपका टेक्स्ट ब्राउज़र के अपने `DOMParser` को भी कभी नहीं देता।
- **XML से निकलने वाली हर वैल्यू स्ट्रिंग होती है।** `<port>8080</port>` यह नहीं कहता कि वह कोई संख्या है, इसलिए JSON में `"8080"` लिखा जाता है। आपकी तरफ़ से यह तय करना ऐसी जानकारी गढ़ना होगा जो आगे ऐसे चलती रहे जैसे वह फ़ाइल में थी ही।
- **गूगल क्या लोड करता है, और उसे क्या नहीं दिया जाता।** विज्ञापन और माप वाली स्क्रिप्ट गूगल से आती हैं, और दान वाला बटन Buy Me a Coffee से। इनमें से किसी को भी आपके टेक्स्ट का एक अक्षर नहीं दिया जाता। जो भी लाइन उसे पढ़ती, पार्स करती या लिखती है, वह इसी ओरिजिन से आती है और रिपॉज़िटरी में दर्ज है।
- **यह ऑफ़लाइन चलता है।** नेटवर्क काट दीजिए और टूल जस का तस रहता है, क्योंकि इसमें कभी नेटवर्क वाला कदम था ही नहीं। इससे आसान सबूत कोई नहीं।

**खुद जाँच लीजिए।** ऊपर लिखी किसी भी बात को भरोसे पर मानने की ज़रूरत नहीं। यह पेज रिपॉज़िटरी के टेम्पलेट और कॉन्फ़िग से बनता है, एक ऐसी बिल्ड स्क्रिप्ट के ज़रिए जिसे आप पढ़ भी सकते हैं और खुद चला भी सकते हैं। उसका नतीजा `dist` ब्रांच पर कमिट रहता है, यानी जो सर्व हो रहा है और सोर्स से बिल्ड करने पर जो बनता है, दोनों का फ़र्क आप खुद देख सकते हैं: https://github.com/A-Box-of-Tools/website

सबसे पहले पढ़ने लायक फ़ाइलें ये हैं — Content-Security-Policy के लिए `config/site.toml`, यह बताने वाले पार्सर के लिए कि कौन-सा टैग कभी बंद ही नहीं हुआ, `src/shared/parse-xml.js`, और XML से हर वैल्यू अंदाज़े के बजाय स्ट्रिंग बनकर क्यों निकलती है, इसके लिए `src/convert.js`।
