दिलचस्प पोस्ट
एक std :: vector के इटरेटर के सूचकांक को प्राप्त करने का सबसे प्रभावी तरीका क्या है? "एकाधिक लक्ष्य प्रतिमान" मेकफाइल त्रुटि ^, $ Regex में इस प्रतीक का उपयोग कब किया जाए? कोणीय 2 टाइपस्क्रिप्ट एप में पल। जेएस लाइब्रेरी का उपयोग कैसे करें? 64 बिट डेल्फी में नेस्टेड स्थानीय फ़ंक्शन को क्यों नहीं ले जा सकता? स्रोत कोड में एथ के लिए उपयोग किए जाने वाले पासवर्ड को संभालना सी # कन्स्ट्रक्टर चेनिंग? (यह कैसे करना है?) IOS में NSDictionary से JSON स्ट्रिंग जेनरेट करें क्या मैं अजगर के सरल एचटीटीपीएस सर्वर के साथ एक हेडर सेट कर सकता हूँ? Android देशी कैमरे का उपयोग करके फोटो सहेजना बंद करें क्या स्थानीय फाइल पर एक्सएसएल ट्रांस्फ़ॉर्म करने के लिए क्रोम बनाया जा सकता है? स्प्रिंग बूट और एनोटेशन के साथ ViewResolver को कॉन्फ़िगर करें, URI त्रुटि के साथ HTTP अनुरोध के लिए कोई मानचित्रण नहीं मिला एम्बेडेड जेटटी में वैकल्पिक पथ से स्थिर फाइलों की सेवा तारीख तक PHP ऑर्डर सरणी? एंड्रॉइड यूएसबी होस्ट और छुपे हुए डिवाइस

अमान्य (खराब / अच्छी तरह से नहीं बनाई गई) XML को कैसे पार्स करना है?

वर्तमान में, मैं एक ऐसी सुविधा पर काम कर रहा हूं जिसमें XML को पार्स करना शामिल है, जिसे हमें किसी अन्य उत्पाद से प्राप्त होता है। मैंने कुछ वास्तविक ग्राहक डेटा के खिलाफ कुछ परीक्षण चलाने का निर्णय लिया और ऐसा लगता है कि अन्य उत्पाद उन उपयोगकर्ताओं से इनपुट की अनुमति दे रहे हैं जिन्हें अमान्य माना जाना चाहिए। वैसे भी, मुझे अभी भी इसे पार्स करने के लिए एक रास्ता खोजना होगा। हम javax.xml.parsers.DocumentBuilder का उपयोग कर रहे हैं और मुझे इनपुट पर एक त्रुटि मिल रही है जो निम्न की तरह दिखती है।

 <xml> ... <description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description> ... </xml> 

जैसा कि आप बता सकते हैं, वर्णन में इसके अंदर एक अमान्य टैग दिखाई देता है ( <THIS-IS-PART-OF-DESCRIPTION> )। अब, यह विवरण टैग एक पत्ता टैग के रूप में जाना जाता है और इसके अंदर किसी नेस्टेड टैग नहीं होना चाहिए। भले ही, यह अभी भी एक मुद्दा है और DocumentBuilder.parse(...) पर अपवाद उत्पन्न करता है

मुझे पता है कि यह अमान्य XML है, लेकिन यह अनुमानतः अमान्य है। ऐसे इनपुट को पार्स करने के लिए कोई भी विचार?

Solutions Collecting From Web of "अमान्य (खराब / अच्छी तरह से नहीं बनाई गई) XML को कैसे पार्स करना है?"

यह "XML" अमान्य से भी बुरा है – यह अच्छी तरह से नहीं है ; देखें अच्छी तरह से बनाम वैध XML

अपराधों की अनुमानितता का अनौपचारिक मूल्यांकन मदद नहीं करता है। वह पाठ डेटा XML नहीं है कोई कन्फर्मेंट एक्सएमएल उपकरण या लाइब्रेरी आप इसे प्रोसेस करने में मदद कर सकते हैं।

वांछनीयता घटने के क्रम में विकल्प:

  1. क्या प्रदाता समस्या को उनके अंत में ठीक कर सकता है मांग अच्छी तरह से बनाई गई XML (तकनीकी रूप से वाक्यांश अच्छी तरह से निर्मित XML अनावश्यक है लेकिन जोर देने के लिए उपयोगी हो सकता है।)
  2. एक्सएमएल के रूप में पार्सिंग से पहले समस्या को साफ करने के लिए सहिष्णु मार्कअप पार्सर का उपयोग करें:

    • स्टैंडअलोन: एक्सएमएल स्टारलेट में मजबूत सुधार और मरम्मत क्षमताओं क्रेडिट: रोमनपेरेख्रेस्ट

       xmlstarlet fo -o -R -H -D bad.xml 2>/dev/null 
    • स्टैंडअलोन और सी: एचटीएमएल स्वच्छ एक्सएमएल के साथ भी काम करता है

    • पायथन: सुंदर सूप पायथन-आधारित है। पार्सर्स अनुभाग के बीच अंतर में नोट्स देखें पायथन में गैर-अच्छी तरह से बनाई गई मार्कअप से निपटने के लिए अधिक सुझावों के लिए इस प्रश्न के उत्तर भी देखें। अवैध वर्णों को साफ करने के लिए codecs.EncodedFile() का उपयोग करने के लिए यह जवाब भी देखें।
    • जावा: जेसोव HTML पर केंद्रित है FilterInputStream का उपयोग प्रीप्रोसेसिंग क्लीनअप के लिए किया जा सकता है।
    • नेट:

      • XmlReaderSettings.CheckCharacters पिछले अवैध एक्सएमएल चरित्र समस्याओं को प्राप्त करने के लिए अक्षम किया जा सकता है

      • @ jdweng की रिपोर्ट है कि XmlReader.ReadToFollowing() उपयोग कभी-कभी एक्सएमएल वाक्यविन्यास समस्याओं के लिए किया जा सकता है, लेकिन नीचे # 3 में नियम-तोड़कर चेतावनी नोट करें।

      • Microsoft.Language.Xml.XMLParser को "त्रुटि-सहिष्णु" कहा जाता है
    • PHP: DOMDocument :: पुनर्प्राप्ति देखें और libxml_use_internal_errors (सत्य) देखें । अच्छा उदाहरण यहाँ देखें
    • R: R में फॉल्ट-सहिष्णु मार्कअप पार्सिंग के लिए htmlTreeParse () देखें
  3. पाठ संपादक के रूप में डेटा के रूप में डेटा पर प्रक्रिया करें या वर्ण / स्ट्रिंग फ़ंक्शंस का उपयोग करके प्रोग्राम। इस प्रोग्राम को करना मुश्किल से असंभव हो सकता है, क्योंकि जो पूर्वानुमानित प्रतीत होता है वह अक्सर नहीं है – नियम तोड़कर शायद ही नियमों से बाध्य होता है

    • अमान्य वर्ण त्रुटियों के लिए , अमान्य वर्णों को हटाने / बदलने के लिए regex का उपयोग करें:
      • PHP: preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $s);
      • रूबी: string.tr("^\u{0009}\u{000a}\u{000d}\u{0020}-\u{D7FF}\u{E000‌​}-\u{FFFD}", ' ')
      • जावास्क्रिप्ट: inputStr.replace(/[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm, '')

मानक एक्सएमएल पार्सर डिजाइन द्वारा अवैध एक्सएमएल को कभी भी स्वीकार नहीं करेगा।

आपका एकमात्र विकल्प "पूर्वनिर्धारित अमान्य" सामग्री को निकालने के लिए इनपुट को पूर्व-प्रक्रिया करना है, या इसे पार्स करने से पहले, सीडीएटीए में लपेटता है।