2010-05-11 4 views
7

मैं XML दस्तावेज़ को पार्स करने के लिए जावा के DocumentBuilder.parse(InputStream) का उपयोग कर रहा हूं। कभी-कभी, मुझे विकृत XML दस्तावेज़ मिलते हैं जिसमें अंतिम > के बाद अतिरिक्त जंक होता है जो SAXException: Content is not allowed in trailing section का कारण बनता है। (मैंने देखा है कि मामलों में, जंक बस एक या अधिक शून्य बाइट्स है।)अनदेखा करना "पिछला भाग में सामग्री की अनुमति नहीं है" SAXException

मुझे परवाह नहीं है कि अंतिम > के बाद क्या है। क्या जावा में एक संपूर्ण एक्सएमएल दस्तावेज़ को पार्स करने का कोई आसान तरीका है और क्या यह किसी भी पीछे की जंक को अनदेखा कर रहा है?

ध्यान दें कि "अनदेखा" द्वारा मुझे अपवाद को पकड़ने और अनदेखा करने का मतलब नहीं है: मेरा मतलब है पिछला जंक अनदेखा करना, कोई अपवाद नहीं डालना, और Document ऑब्जेक्ट को वापस करने के लिए एक्सएमएल के बाद से अंतिम > मान्य है।

उत्तर

8

चूंकि आपका प्रेषक आपको अमान्य एक्सएमएल के साथ पेश कर रहा है, इसलिए यदि आप इस अपवाद से बचना चाहते हैं तो इसे पार्सर को हिट करने से पहले इसे ठीक करने की आवश्यकता है। यदि आप प्रेषक को सही नहीं कर सकते हैं, तो आपको किसी प्रकार के प्रीप्रोकैसिंग चरण की आवश्यकता होगी।

यदि स्थिति बस यह है कि आपके पास किसी अन्य उत्तर में आपकी प्रतिक्रियाओं के कारण बंद टैग के बाद अतिरिक्त नल बाइट्स हैं, तो यह संभव है कि आप FilterInputStream में अपनी इनपुट स्ट्रीम को लपेटकर आसानी से पूरा कर सकें शून्य बाइट्स को छोड़ने के लिए लागू करें।

यदि समस्या सिर्फ शून्य वर्णों की तुलना में अधिक जटिल है, तो आपको निश्चित रूप से एक अधिक जटिल फ़िल्टर की आवश्यकता होगी, जो मुश्किल हो सकता है।

यदि आप ContentHandler का उपयोग कर रहे हैं, तो आप इसमें एक कॉलबैक जोड़ सकते हैं ताकि यह कॉलिंग कोड को सूचित कर सके जब अंत रूट टैग को संभाला जा सके, और उस ज्ञान के आधार पर, कॉलिंग कोड में तर्क हो सकता है अगर अंतराल को संकेत दिया गया है तो इसे आसानी से अनदेखा करने के लिए हैंडलर। उस बिंदु पर पार्सर द्वारा किया जाने वाला कुछ भी संभवतः किया गया है! लेकिन यह समाधान आपकी स्थिति के लिए लागू नहीं प्रतीत होता है।

-5

नहीं। एक दस्तावेज़ जिसमें पीछे वर्ण हैं, एक XML दस्तावेज़ नहीं है। प्रेषक को ठीक करें।

+3

मेरे पास प्रेषक पर कोई नियंत्रण नहीं है। और आपका "उत्तर" उस भावना में नहीं है जो आप स्वीकार करते हैं और जो आप उत्सर्जित करते हैं उसमें सख्त बनें। " –

+0

आपने पूछा "क्या जावा में एक संपूर्ण एक्सएमएल दस्तावेज़ को पार्स करने का कोई आसान तरीका है और क्या यह किसी भी पीछे की जंक को नजरअंदाज कर देता है?" जवाब "नहीं, वहां नहीं है", और मैंने कारण दिया। हो सकता है कि आप http://home.ccil.org/~cowan/XML/tagsoup/ ढूंढ रहे हों? शायद आप जानते हैं कि आपके एक्सएमएल में सीडीएटीए नहीं है और आप एक आदिम इनपुटस्ट्रीम रैपर को कार्यान्वित कर सकते हैं? मुझे यकीन नहीं है कि आप किस उत्तर की तलाश में हैं। –

+0

प्रत्येक एक्सएमएल पार्सर प्रत्येक तत्व का ट्रैक रखता है और जानता है कि तत्व कहां बंद कर दिया गया है> इसके बंद टैग के पार्सिंग द्वारा "बंद" किया गया है। इसका मतलब है कि प्रत्येक एक्सएमएल पार्सर फाइनल को भी जानता है> जब इसे देखता है क्योंकि पहला तत्व इसके समापन टैग द्वारा संतुलित किया गया है। उस बिंदु पर, मैं पार्सर को बस रुकना चाहता हूं। आप इसे इससे अधिक जटिल बना रहे हैं। –

संबंधित मुद्दे