दिलचस्प पोस्ट
पोस्टग्रेस के प्राथमिक कुंजी अनुक्रम को रीसेट कैसे करें जब यह सिंक से बाहर हो जाता है? अंतर्निहित बनाम स्पष्ट इंटरफ़ेस कार्यान्वयन नेटबीन्स में जार फ़ाइल कैसे बनाएं निर्माता प्रतीकों का दोहरी उत्सर्जन jQuery और Mootools संघर्ष फ़ाइल में एक विशिष्ट पंक्ति को हटाना (अजगर) दृश्य स्टूडियो में स्वत: स्वरूपण बंद करें बिटमैप को बिटमैप सोर्स WPF में तेजी से परिवर्तित करना एक-आयामी सरणी में बहुआयामी सरणी को चालू करना धारावाहिककरण और Deserializing एक्सप्रेशन पेड़ में सी # अनगिनत सीग्यू के साथ डेटा पास करना क्या उत्पाद समीक्षाओं को प्राप्त करने के लिए एक Amazon.com API है? सी # में स्ट्रिंग एक संदर्भ प्रकार है जो मूल्य प्रकार की तरह व्यवहार करता है? जावा के मुख्य पुस्तकालयों में GoF डिजाइन पैटर्न के उदाहरण उबंटु में ANDROID_HOME पथ को कैसे सेट करें? कृपया चरण प्रदान करें

अमान्य (खराब / अच्छी तरह से नहीं बनाई गई) 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 है, लेकिन यह अनुमानतः अमान्य है। ऐसे इनपुट को पार्स करने के लिए कोई भी विचार?

वेब के समाधान से एकत्रित समाधान "अमान्य (खराब / अच्छी तरह से नहीं बनाई गई) 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, '')

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

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