यह पेज हिन्दी में दिखाया जा रहा है, क्योंकि आपका ब्राउज़र यही भाषा माँगता है।
इस पेज का कोड चालू नहीं हुआ।
index.html को सीधे किसी फ़ोल्डर से खोलने पर ब्राउज़र JavaScript मॉड्यूल रोक देता है, इसलिए कोई फ़ाइल चुनने पर कुछ नहीं होगा। इसके बजाय फ़ोल्डर को http पर सर्व कीजिए:
ऊपर फ़ाइल चुनते ही यह खुल जाएगा।तैयार — इंटरनेट काट दीजिए, यह फिर भी चलता रहेगा।इस ब्राउज़र में उपलब्ध नहीं (बाकी सब फिर भी चलता है)।ऑफ़लाइन कैश के लिए https:// या localhost चाहिए।यहाँ कैश नहीं हो सकता, पर अपलोड फिर भी कुछ नहीं होता।आपकी फ़ाइलें कहीं नहीं गईं। {total} फ़ाइलें लोड हुईं, और वे सब इसी साइट की अपनी हैं। {platform}किसी चीज़ ने {hosts} से संपर्क किया, और यह टूल ऐसा कभी नहीं करता। यह देखने लायक बात है। {platform}विज्ञापन, माप और दान वाले बटन के लिए साइट की अपनी स्क्रिप्ट {hosts} होस्ट से आईं। उनमें से किसी को न कोई फ़ाइल मिली, न उसका एक बाइट।विज्ञापन, माप और दान वाले बटन के लिए साइट की अपनी स्क्रिप्ट {hosts} होस्ट से आईं। उनमें से किसी को न कोई फ़ाइल मिली, न उसका एक बाइट।कुछ गड़बड़ हो गई: {detail}। दोबारा शुरू करने के लिए पेज फिर से लोड कीजिए।{count} फ़ाइल पढ़ी जा रही है…{count} फ़ाइलें पढ़ी जा रही हैं…कोई उदाहरण आज़माइएउदाहरण बनाया जा रहा है…यह ब्राउज़र उदाहरण नहीं बना सका। इसके बजाय कोई फ़ाइल चुनिए।
XML फ़ॉर्मैटर — सजाइए, दबाकर सपाट कीजिए, या JSON बनाइए
पढ़ने के लिए सजाया गया XML या भेजने के लिए दबाकर सपाट किया गया XML, और दोनों तरफ़ JSON में बदला हुआ। इनमें से कुछ भी किसी और के सर्वर में पेस्ट नहीं होता।
● यह टूल XML और JSON फ़ाइलें कभी अपलोड नहीं करता। यहाँ कोई सर्वर है ही नहीं।
फ़ॉर्मैट करना और बदलना एक स्ट्रिंग पर की गई गणित है, और वह यहीं, इसी पेज पर होती है। पार्सर हाथ से लिखा हुआ है और src/shared/parse-xml.js में है, इसके अलावा कुछ नहीं। इस टूल में किसी भी तरह की नेटवर्क सुविधा है ही नहीं — न कुछ लाने को, न कुछ भेजने को — और यहाँ इसका वज़न “XML” शब्द से लगने वाले वज़न से ज़्यादा है: इस फ़ॉर्मैट में जो आता है वह आम तौर पर एक इनवॉइस, एक बैंक स्टेटमेंट, एक मेडिकल रिकॉर्ड, या हेडर में किसी के क्रेडेंशियल लिए हुए SOAP रिक्वेस्ट होती है।
✗ कोई अपलोड नहीं
✗ कोई खाता नहीं
✗ साइज़ की कोई सीमा नहीं
✓ ऑफ़लाइन चलता है
✓ ओपन सोर्स
लाइव जाँच:जाँच जारी…
ऑफ़लाइन:जाँच जारी…
हमारी बात मानने की ज़रूरत नहीं: DevTools खोलिए, नेटवर्क टैब देखिए और कुछ फ़ॉर्मैट कीजिए। किसी एक भी रिक्वेस्ट में आपके पेस्ट किए हुए का एक अक्षर नहीं जाता। या इंटरनेट काट दीजिए और फिर भी फ़ॉर्मैट कर लीजिए।
प्राइवेसी का यह दावा कैसे जाँचा जा सकता है
आप जो पेस्ट करते हैं उसके जाने की कोई जगह नहीं है। 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 ब्रांच पर कमिट रहता है, यानी जो सर्व हो रहा है और सोर्स से बिल्ड करने पर जो बनता है, दोनों का फ़र्क आप खुद देख सकते हैं:
सबसे पहले पढ़ने लायक फ़ाइलें ये हैं — Content-Security-Policy के लिए config/site.toml, यह बताने वाले पार्सर के लिए कि कौन-सा टैग कभी बंद ही नहीं हुआ, src/shared/parse-xml.js, और XML से हर वैल्यू अंदाज़े के बजाय स्ट्रिंग बनकर क्यों निकलती है, इसके लिए src/convert.js।
अगर आपके दफ़्तर का सुरक्षा सॉफ़्टवेयर अपलोड की चेतावनी दे। वह उस पल पर नज़र रखता है जब ब्राउज़र में फ़ाइल चुनी जाती है, और यह नहीं जान सकता कि पन्ना उसे भेजने वाला है या नहीं — इसलिए चुनने पर ही चेतावनी देता है। यहाँ से कुछ नहीं भेजा जाता: ब्राउज़र के डेवलपर टूल खोलिए, Network पर जाइए, और एक फ़ाइल चुनिए। उसे ले जाने वाला कोई अनुरोध नहीं है, और पन्ने की अपनी स्थानीय झलक के अलावा कोई अनुरोध ही नहीं। यही जाँच आपकी IT टीम आधे मिनट में कर सकती है।
1 काम चुनिए
लेआउट दबाकर सपाट करना वही दस्तावेज़ है, बस हर वह स्पेस हटाकर जो सिर्फ़ पढ़ने के लिए था।
सबसे बाहरी एलिमेंट का नाम XML के सिरे पर एक एलिमेंट होता है और JSON में नहीं होता, इसलिए एक गढ़ना ही पड़ता है।
{reason} (पंक्ति {line}, कॉलम {column})पाठ का अंतएक पंक्ति-विरामएक टैब«{ch}»यह टिप्पणी कभी बंद ही नहीं होतीयह CDATA खंड कभी बंद ही नहीं होतायह घोषणा कभी बंद ही नहीं होतीयह बंद करने वाला टैग कभी पूरा ही नहीं होता<{name}> कभी बंद ही नहीं होता</{name}> ऐसा टैग बंद करता है जो कभी खुला ही नहीं था</{name}> एक तत्व बंद करता है जबकि <{open}> अब भी खुला हैअनपेक्षित: <{name}> के भीतर «{ch}»टैग का नाम किसी अक्षर से शुरू होना चाहिए<{name}> कभी पूरा ही नहीं होता«{name}» विशेषता का कोई मान नहीं, और XML इसकी इजाज़त नहीं देताइस विशेषता का मान कभी बंद ही नहीं होताXML में विशेषता का मान उद्धरण चिह्नों में होना चाहिएअनपेक्षित: मान के अंत के बाद {found}पाठ समय से पहले खत्म हो गयाकुंजी को दोहरे उद्धरण चिह्नों वाली स्ट्रिंग होना चाहिए, और यह {found} हैकुंजी के बाद कोलन की उम्मीद थी, मिला {found}अनपेक्षित: {found}अल्पविराम या बंद करने वाला मझला कोष्ठक चाहिए था, मिला {found}अल्पविराम या बंद करने वाला वर्ग कोष्ठक चाहिए था, मिला {found}यह ऑब्जेक्ट कभी बंद ही नहीं होतायह ऐरे कभी बंद ही नहीं होतायह स्ट्रिंग कभी बंद ही नहीं होती\u के बाद चार हेक्साडेसिमल अंक आने चाहिए\{next} ऐसा एस्केप नहीं जिसे JSON जानता होस्ट्रिंग के भीतर एक कच्चा कंट्रोल कैरेक्टर — उसे एस्केप की तरह लिखिएयह ऐसी संख्या नहीं जिसकी JSON इजाज़त देता होXML से JSONJSON से XMLविशेषताएँ @ वाले नाम के सदस्य बन जाती हैं, तत्व का अपना पाठ वहाँ #text बन जाता है जहाँ उसे जगह बाँटनी पड़े, और हर मान स्ट्रिंग ही रहता है — XML ने कभी कहा ही नहीं कि कौन-से संख्याएँ थीं।ऐरे एक दोहराया हुआ तत्व बन जाता है, और वापस पढ़ा जाने वाला यही एक रूप है। खाली ऑब्जेक्ट और खाली स्ट्रिंग, दोनों खाली तत्व बनकर निकलते हैं।{n} B{n} KB{n} MBफ़ाइल पढ़ी जा रही है…वह फ़ाइल पढ़ी नहीं जा सकी: {reason}अभी कुछ नहीं।कुछ निकला ही नहीं।XML, दबाकर सपाट कियाXML, सजाकर रखा{what} — {before} से घटकर {after}, {percent}% कम{what} — {lines} पंक्तियाँ, {size}{name} — {lines} पंक्तियाँ, {size}कॉपीकॉपी हो गयाचुन लिया — Ctrl+C दबाइएआपका XML कहीं नहीं गया। {total} फ़ाइलें लोड हुईं। {platform}किसी चीज़ ने {hosts} से संपर्क किया, और यह टूल ऐसा कभी नहीं करता। {platform}विज्ञापन, माप और दान वाले बटन के लिए साइट की अपनी स्क्रिप्ट {hosts} होस्ट से आईं। उनमें से किसी को उसका एक अक्षर भी नहीं मिला।विज्ञापन, माप और दान वाले बटन के लिए साइट की अपनी स्क्रिप्ट {hosts} होस्ट से आईं। उनमें से किसी को उसका एक अक्षर भी नहीं मिला।
क्या इससे काम बन गया?
क्या गड़बड़ हुई?
शुक्रिया — इससे मदद मिलती है।
सिर्फ़ आपका जवाब भेजा जाता है, वह भी तभी जब आप बटन दबाते हैं। आपकी फ़ाइल, उसका नाम या उससे जुड़ी कोई बात कभी नहीं।
# 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`।
XML को अपलोड किए बिना कैसे फ़ॉर्मैट करें
काम चुनिए। दो टैब, एक बॉक्स: फ़ॉर्मैट XML को सजाता है या दबाकर सपाट करता है; बदलें उसे JSON बनाता है, या JSON को वापस XML। अभी-अभी जो XML आपने सजाया है वही वह XML है जिसे आप बदलते हैं, दो बार पेस्ट किए बिना।
पेस्ट कीजिए, या फ़ाइल छोड़िए। जो कुछ आप चुनकर कॉपी कर सकते हैं वह सब चलता है, और सिलेक्टर पर छोड़ी गई .xml, .svg, .rss या .xsd फ़ाइल को आपका अपना ब्राउज़र पढ़कर बॉक्स में डाल देता है — छोड़ने के लिए अपलोड वाला कोई कदम है ही नहीं।
इंडेंट चुनिए, या दबाकर सपाट कीजिए। दो स्पेस, चार, या एक टैब। दबाकर सपाट करना वही दस्तावेज़ है, बस हर वह स्पेस हटाकर जो सिर्फ़ पढ़ने के लिए था, और नतीजा बताता है कि इससे कितने बाइट बचे।
गड़बड़ी वहीं पढ़िए जहाँ गड़बड़ी है। यहाँ नाकाम होने वाला पार्सर “लाइन 1 पर गड़बड़ी” कहने के बजाय, जो एक ब्राउज़र एक ही बार में पढ़े गए दस्तावेज़ के बारे में कहता है, यह बताता है कि कौन-सा टैग कभी बंद नहीं हुआ और वह किस लाइन और किस कॉलम पर है।
नतीजा ले जाइए। कॉपी कीजिए, या फ़ाइल के रूप में डाउनलोड कीजिए, जिसका नाम उसी फ़ॉर्मैट पर होगा जिसमें वह निकला।
नहीं। इस पेज का पार्सर और प्रिंटर ऐसे फ़ंक्शन हैं जो आपके अपने ब्राउज़र में, आपके अपने हार्डवेयर पर चलते हैं। इस टूल में किसी भी तरह की नेटवर्क सुविधा नहीं है — यह कभी कुछ मँगाता नहीं और कभी कुछ भेजता नहीं — और पेज की 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 फ़ॉर्मैट करने के लिए बाहर भेजता, वह तार निकालते ही रुक जाता।