दिलचस्प पोस्ट
पीजी मणि स्थापित करने का प्रयास करते समय 'libpq-fe.h शीर्षलेख नहीं मिला वेब पेज से एक EXE लॉन्च कैसे करें (asp.net) मैं जैक्सन में एक कस्टम deserializer से डिफ़ॉल्ट deserializer कैसे कॉल करूं? जावा में निर्देशिका को फिर से हटाएं मैं इसे कैसे कस्टम ऑब्जेक्ट के साथ एक NSMutableArray सॉर्ट कर सकता हूँ? उपप्रक्रिया का उपयोग करके अजगर स्क्रिप्ट में इनपुट के साथ अजगर स्क्रिप्ट को कॉल करें अजगर में उपयोगी कब है? यह कैसे पता चले कि किसने एक विधि बुलाया? यूनिट परीक्षण सी कोड पृष्ठभूमि आकार के सिमुलेशन: कैनवास में कवर JQuery के साथ सिमुलेट कीप्रेस JQuery के साथ एक DIV पृष्ठभूमि छवि बदलना विशिष्ट क्लाइंट को socket.io और node.js के साथ संदेश भेजें EditText कर्सर रंग सेट करें यह चल रहा है, जबकि SetInterval के अंतराल को बदलने

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

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

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