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




xml-parsing xml-validation (3)

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

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

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

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


IMO इन मामलों को JSoup का उपयोग करके हल किया जाना चाहिए।

नीचे इस विशिष्ट मामले के लिए वास्तव में जवाब नहीं है, लेकिन यह वेब पर पाया गया (कोडरवॉल पर inuyasha82 के लिए धन्यवाद)। इस कोड बिट ने मुझे विकृत एक्सएमएल से निपटने के दौरान एक और समान समस्या के लिए प्रेरित किया, इसलिए मैं इसे यहां साझा करता हूं।

कृपया नीचे क्या है इसे संपादित न करें, क्योंकि यह मूल वेबसाइट पर जैसा है।

XML प्रारूप, को दस्तावेज़ में घोषित एक अद्वितीय मूल तत्व मान्य होना चाहिए। उदाहरण के लिए एक वैध xml है:

<root>
     <element>...</element>
     <element>...</element>
</root>

लेकिन अगर आपके पास एक दस्तावेज है जैसे:

<element>...</element>
<element>...</element>
<element>...</element>
<element>...</element>

यह एक विकृत XML माना जाएगा, इसलिए कई xml पार्सर केवल एक अपवाद को फेंकते हैं जो किसी मूल तत्व की शिकायत नहीं करते हैं। आदि।

इस उदाहरण में उस समस्या को हल करने के तरीके पर एक समाधान है और ऊपर दिए गए विकृत xml को सफलतापूर्वक पार करने के लिए।

मूल रूप से हम जो करेंगे वह प्रोग्रामेटिक रूप से एक मूल तत्व को जोड़ना है।

तो सबसे पहले आपको अपने "विकृत" xml (यानी एक फ़ाइल) वाले संसाधन को खोलना होगा:

File file = new File(pathtofile);

फिर एक FileInputStream खोलें:

FileInputStream fis = new FileInputStream(file);

यदि हम इस स्ट्रीम को किसी XML लाइब्रेरी के साथ पार्स करने की कोशिश करते हैं तो हम विकृत दस्तावेज़ अपवाद को बढ़ाएंगे।

अब हम तीन लेयमेंट के साथ InputStream ऑब्जेक्ट की एक सूची बनाते हैं:

एक बाइटइपटस्ट्रीम तत्व जिसमें स्ट्रिंग होता है: "" हमारी फाइलइंस्ट्रीमस्ट्रीम एक बाइटइन्पुटस्ट्रीम स्ट्रिंग के साथ: "" तो कोड है:

List<InputStream> streams = 
    Arrays.asList(
        new ByteArrayInputStream("<root>".getBytes()),
    fis,
    new ByteArrayInputStream("</root>".getBytes()));

अब SequenceInputStream का उपयोग करके, हम ऊपर बनाई गई सूची के लिए एक कंटेनर बनाते हैं:

InputStream cntr = 
new SequenceInputStream(Collections.enumeration(str));

अब हम किसी भी XML पार्सर लाइब्रेरी का उपयोग कैंटर पर कर सकते हैं, और इसे बिना किसी समस्या के पार्स किया जाएगा। (स्टेक्स लाइब्रेरी के साथ जांचा गया);


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

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


स्वीकृत उत्तर अच्छी सलाह है, और इसमें बहुत उपयोगी लिंक हैं।

मैं इसे जोड़ना चाहता हूं, और नहीं-विकृत और / या DTD-अमान्य XML के many other मामलों को SGML, HTML और XML के आईएसओ-मानकीकृत सुपरसेट का उपयोग करके मरम्मत किया जा सकता है। आपके मामले में, जो काम करता है वह फर्जी THIS-IS-PART-OF-DESCRIPTION तत्व को SGML खाली तत्व घोषित करता है और फिर उदाहरण के लिए उपयोग करता है। इसे एक्सएमएल में बदलने के लिए ओएक्सएक्स प्रोग्राम (ओपनएसपी / ओपनजेड एसजीएमएल पैकेज का हिस्सा)। उदाहरण के लिए, यदि आप निम्नलिखित को osx आपूर्ति करते हैं

<!DOCTYPE xml [
  <!ELEMENT xml - - ANY>
  <!ELEMENT description - - ANY>
  <!ELEMENT THIS-IS-PART-OF-DESCRIPTION -  - EMPTY>
]>
<xml>
  <description>blah blah
    <THIS-IS-PART-OF-DESCRIPTION>
  </description>
</xml>

यह आपकी पसंद के XML उपकरणों के साथ आगे की प्रक्रिया के लिए अच्छी तरह से गठित XML का उत्पादन करेगा।

हालाँकि, ध्यान दें कि आपके उदाहरण स्निपेट में xml या XML या Xml आदि अक्षरों से शुरू होने वाले तत्व नामों में एक और समस्या है जो XML में आरक्षित है, और XML पार्सर के अनुरूप नहीं होगी।





xml-validation