जीएई पर पूरी तरह से वैध एक्सएमएल को पार्स करते समय "सामग्री की अनुमति नहीं दी जाती है"


109

मैं पिछले 48 घंटों से इस पूरी तरह से घुसपैठ वाले बग के खिलाफ अपना सिर पीट रहा हूं, इसलिए मैंने सोचा कि मैं आखिर में तौलिया फेंक दूंगा और खिड़की से बाहर अपना लैपटॉप फेंकने से पहले यहां पूछने की कोशिश करूंगा।

मैं एक कॉल से प्रतिक्रिया XML पार्स करने की कोशिश कर रहा हूं जो मैंने AWS सिंपलडीबी को किया था। प्रतिक्रिया ठीक तार पर वापस आ रही है; उदाहरण के लिए, ऐसा लग सकता है:

<?xml version="1.0" encoding="utf-8"?> 
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
    <ListDomainsResult>
        <DomainName>Audio</DomainName>
        <DomainName>Course</DomainName>
        <DomainName>DocumentContents</DomainName>
        <DomainName>LectureSet</DomainName>
        <DomainName>MetaData</DomainName>
        <DomainName>Professors</DomainName>
        <DomainName>Tag</DomainName>
    </ListDomainsResult>
    <ResponseMetadata>
        <RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
        <BoxUsage>0.0000071759</BoxUsage>
    </ResponseMetadata>
</ListDomainsResponse>

मैं इस XML में एक पार्सर के साथ गुजरता हूं

XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());

और eventReader.nextEvent();जो डेटा मुझे चाहिए उसे प्राप्त करने के लिए कई बार कॉल करें ।

यहाँ विचित्र हिस्सा है - यह स्थानीय सर्वर के अंदर बहुत अच्छा काम करता है। प्रतिक्रिया आती है, मैं इसे पार्स करता हूं, हर कोई खुश है। समस्या यह है कि जब मैं Google ऐप इंजन को कोड तैनात करता हूं, तो आउटगोइंग अनुरोध अभी भी काम करता है, और प्रतिक्रिया XML 100% समान और मेरे लिए सही लगती है, लेकिन प्रतिक्रिया निम्न अपवाद के साथ पार्स करने में विफल रहती है:

com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?> 
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
    at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
    at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
    ... (rest of lines omitted)

मेरे पास डबल, ट्रिपल, चौगुनी है इस XML को 'अदृश्य वर्णों' या गैर-यूटीएफ 8 एनकोडेड वर्णों आदि के लिए जांचा। मैंने इसे बाइट-ऑर्डर-मार्क्स या उस प्रकृति के कुछ के लिए एक सरणी में बाइट-बाय-बाइट पर देखा। कुछ भी तो नहीं; यह मेरे द्वारा फेंके जाने वाले हर सत्यापन परीक्षण से गुजरता है। यहां तक ​​कि अजनबी, ऐसा होता है अगर मैं सैक्सन-आधारित पार्सर का उपयोग करता हूं - लेकिन केवल जीएई पर, यह हमेशा मेरे स्थानीय वातावरण में ठीक काम करता है।

समस्याओं के लिए कोड का पता लगाना बहुत कठिन हो जाता है जब मैं केवल डिबगर को ऐसे वातावरण पर चला सकता हूं जो पूरी तरह से काम करता है (मुझे जीएई पर दूरस्थ रूप से डिबग करने का कोई अच्छा तरीका नहीं मिला है)। फिर भी, मेरे पास मौजूद आदिम साधनों का उपयोग करते हुए, मैंने एक लाख दृष्टिकोण की कोशिश की है जिसमें शामिल हैं:

  • XML के साथ और बिना prolog
  • साथ और बिना नई सुर्खियों के
  • के साथ और "एन्कोडिंग =" विशेषता के बिना prolog में
  • दोनों न्यू स्टाइल
  • HTTP स्ट्रीम में मौजूद चैंकिंग जानकारी के साथ और उसके बिना

और मैंने इनमें से अधिकांश को कई संयोजनों में आज़माया है जहाँ यह समझ में आता है कि वे बातचीत करेंगे - कुछ भी नहीं! मेरा विवेक खत्म हो रहा है। किसी को इस तरह से पहले एक मुद्दा देखा है कि उम्मीद कर सकते हैं उस पर कुछ प्रकाश डाला?

धन्यवाद!


हमें शायद कुछ और कोड देखने की जरूरत है। एक और संभावना यह है कि स्थानीय रूप से इसे जीएई पर चांस नहीं मिल रहा है। पार्सर को पास करने से पहले आप कोड को कैसे संभाल रहे हैं?
रोमेन हिप्पो

मैंने इस संभावना पर भी विचार किया, लेकिन यह त्रुटि संदेश के बाद से ऐसा प्रतीत नहीं होता है कि जो पार्सर फेंक रहा है, उसमें संपूर्ण XML सही है (यह ऊपर चिपकाया गया है)। संपूर्ण संशोधित एसडीके कोड github.com/AdrianP/aws-sdk-for-java (सबसे हाल के कॉमेट्स पर देखें) पर पाया जा सकता है, लेकिन वहां बहुत सारे कोड हैं। मैं जल्द ही एक छोटा प्रजनन योग्य नमूना बनाने की कोशिश करूंगा, हालांकि यह भी कठिन होगा। यह सॉफ्टवेयर का एक बड़ा जटिल टुकड़ा है ... आपकी प्रतिक्रिया के लिए धन्यवाद! :)
एड्रियन पेट्रेस्कु


@ रेवाल्ड, मुझे नहीं लगता कि यह मेरा प्रश्न है कि डुप्लिकेट है, क्योंकि मेरा प्रश्न एक साल पहले उस से एक पोस्ट किया गया था :)
एड्रियन पेट्रेस्क्यू

1
यह एक उदाहरण होना चाहिए कि एसओ पर एक प्रश्न कैसे पूछा जाना चाहिए, इसके माध्यम से पढ़ने से मुझे एक डेवलपर (धन्यवाद ओपी) के रूप में डिबग करने के विभिन्न अंतर्दृष्टि
मिलीं

जवाबों:


129

आपके XML और XSD (या DTD) में एन्कोडिंग अलग हैं।
XML फ़ाइल हेडर: <?xml version='1.0' encoding='utf-8'?>
XSD फ़ाइल हेडर:<?xml version='1.0' encoding='utf-16'?>

एक अन्य संभावित परिदृश्य जो इसका कारण बनता है, जब XML दस्तावेज़ प्रकार घोषणा से पहले कुछ भी आता है। अर्थात आपके पास बफर में कुछ इस तरह हो सकता है:

helloworld<?xml version="1.0" encoding="utf-8"?>  

या यहां तक ​​कि एक अंतरिक्ष या विशेष चरित्र।

कुछ विशेष वर्ण बाइट ऑर्डर मार्कर कहलाते हैं जो बफर में हो सकते हैं। पार्सर को बफर पास करने से पहले ऐसा करें ...

String xml = "<?xml ...";
xml = xml.trim().replaceFirst("^([\\W]+)<","<");

हाय रोमैन, प्रतिक्रिया के लिए धन्यवाद! मैं डबल और ट्रिपल में कई बार जाँच से पहले बफर में छिपा हुआ है (छिपा पात्रों सहित), लेकिन वहाँ बस कुछ और नहीं है। मैं utf-16 को एन्कोडिंग में बदलने की कोशिश करूँगा, हालाँकि - जिज्ञासा से बाहर, आपको यह जानकारी कहाँ से मिली कि XSD UTF-16 का उपयोग करता है?
एड्रियन पेट्रेस्कु

@ Adrian Petrescu क्षमा करें, ये केवल उदाहरण हैं यदि आप DTDs या XSD का उपयोग कर रहे हैं तो सुनिश्चित करें कि वे आपके XML के साथ मेल खाते हैं। इससे पहले कि आप XML को स्ट्रींग में कैप्चर करें और उसे चारों ओर से घेर लें '|' और इसे कंसोल पर प्रिंट करें। यह आपको बताएगा कि क्या आप कुछ अतिरिक्त पात्रों में से गुजर रहे हैं।
रोमेन हिप्पो

आह, मैं देख रहा हूँ :) दुर्भाग्य से मैंने इसकी कोशिश की और यह इस स्थिति में ऐसा प्रतीत नहीं होता है। फिर भी धन्यवाद!
एड्रियन पेट्रेस्कु

1
धन्यवाद! इसने मुझे भी बचाया। xml.trim () replaceFirst ( "^ ([\\ डब्ल्यू]) <", "<")।;
stackoverflow

2
कृपया कोई इसे स्वीकृत उत्तर दें। मेरी समस्या का सीधे समाधान किया। मैं उस संदेश को पार्स कर रहा था जो "संदेश: <? Xml संस्करण ...." के साथ शुरू हुआ था। समस्या थी xml बिट से पहले पाठ। धन्यवाद :)
रिक जॅफ

8

यह त्रुटि संदेश हमेशा शुरुआती तत्व में अमान्य XML सामग्री के कारण होता है। उदाहरण के लिए, अतिरिक्त छोटे बिंदु "।" XML तत्व की शुरुआत में।

<?xml…." Org.xml.sax.SAXParseException " के ऊपर "कारण " से पहले कोई भी वर्ण : सामग्री को अनुमति नहीं दी जाती है "त्रुटि संदेश में"।

एक छोटी सी बिंदी ” " से पहले“<?xml….

इसे ठीक करने के लिए, पहले उन सभी अजीब पात्रों को हटा दें “<?xml“

रेफरी: http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/


3
आपको उल्लेख करना चाहिए कि आपने कहां उल्लेख किया है कि mkyong.com/java/sax-error-content-is-not-allowed-in-prolog
arulraj.net

5

मैं उसी मुद्दे का सामना कर रहा था। मेरे मामले में XML फाइलें c # प्रोग्राम से उत्पन्न हुईं और आगे की प्रक्रिया के लिए AS400 में फीड की गईं। कुछ विश्लेषण के बाद पहचाना गया कि मैं XML फाइल बनाते समय UTF8 एन्कोडिंग का उपयोग कर रहा था जबकि javac (AS400 में) "UTF8 विदाउट बॉम" का उपयोग करता है। तो, नीचे उल्लिखित अतिरिक्त कोड लिखना होगा:

//create encoding with no BOM
Encoding outputEnc = new UTF8Encoding(false); 
//open file with encoding
TextWriter file = new StreamWriter(filePath, false, outputEnc);           

file.Write(doc.InnerXml);
file.Flush();
file.Close(); // save and close it

5

मैंने नोटपैड ++ में xml फ़ाइल का निरीक्षण करने और फ़ाइल को सहेजने के दौरान समस्या की थी, हालांकि मेरे पास शीर्ष utf-8 xx टैग था <?xml version="1.0" encoding="utf-8"?>

नोटपैड ++ में फाइल को एनकोडिंग (टैब) के साथ सहेजकर तय किया गया> UTF-8 में एनकोड करें: चयनित (UTF-8-BOM में एनकोड था)


3

Xml घोषणा को हटाकर इसे हल किया

<?xml version='1.0' encoding='utf-8'?>

2

मेरी xml फ़ाइल में, हैडर इस तरह दिखता है:

<?xml version="1.0" encoding="utf-16"? />

एक परीक्षण फ़ाइल में, मैं फ़ाइल बाइट्स पढ़ रहा था और स्ट्रिंग को बनाने के लिए डेटा को UTF-8 (इस फ़ाइल में शीर्ष लेख को साकार नहीं कर रहा था) को डिकोड कर रहा था।

byte[] data = Files.readAllBytes(Paths.get(path));
String dataString = new String(data, "UTF-8");

जब मैंने इस स्ट्रिंग को एक ऑब्जेक्ट में विभेदन करने की कोशिश की, तो मुझे वही त्रुटि दिखाई दे रही थी:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.

जब मैंने दूसरी लाइन को अपडेट किया

String dataString = new String(data, "UTF-16");

मैं बस ठीक वस्तु deserialize करने में सक्षम था। इसलिए जैसा कि रोमेन ने ऊपर उल्लेख किया था, एन्कोडिंग को मिलान करने की आवश्यकता है।


1

मैं उसी समस्या का सामना कर रहा था जिसे मेरी xml फ़ाइल में "सामग्री को अनुमति नहीं दी गई है"।

उपाय

शुरू में मेरा रूट फोल्डर '# फाइलन ' था।

जब मैंने पहला वर्ण '#' निकाला, तो त्रुटि हल हो गई।

#Filename हटाने की जरूरत नहीं ... इस तरह से आजमाएं ..

फ़ाइल या URL ऑब्जेक्ट को अनमशर्लर विधि से पास करने के बजाय, FileInputStream का उपयोग करें।

File myFile = new File("........");
Object obj = unmarshaller.unmarshal(new FileInputStream(myFile));

1

अप्रत्याशित कारण: #फ़ाइल पथ में वर्ण

कुछ आंतरिक बग के कारण, त्रुटि सामग्री को प्रोलॉग में अनुमति नहीं दी जाती है, यदि फ़ाइल सामग्री अपने आप में 100% सही है, लेकिन आप फ़ाइल नाम की तरह आपूर्ति कर रहे हैंC:\Data\#22\file.xml

यह संभवतः अन्य विशेष वर्णों पर भी लागू हो सकता है।

जांच कैसे करें: यदि आप अपनी फ़ाइल को विशेष वर्णों के बिना पथ में स्थानांतरित करते हैं और त्रुटि गायब हो जाती है, तो यह मुद्दा था।


1

मैंने आज वही त्रुटि संदेश पकड़ा। समाधान यह था कि दस्तावेज को UTF-8 से BOM के साथ BOM के बिना UTF-8 से बदल दिया जाए


मेरी भी यही समस्या थी। फ़ाइल स्वरूप बदलने से समस्या हल हो गई। धन्यवाद!
code_fish

0

मेरे पास स्पेस के बजाय एक टैब कैरेक्टर था। टैब को बदलने से समस्या का समाधान हो गया।

पूरे डॉक को कट करें और नोटपैड ++ जैसे संपादक में पेस्ट करें और सभी वर्णों को प्रदर्शित करें।


0

समस्या के मेरे उदाहरण में, समाधान जर्मन umlauts (äöü) को उनके HTML-समकक्षों के साथ बदलना था ...


0

Bellow "org.xml.sax.SAXParseException" से ऊपर का कारण है: सामग्री को "प्रस्तावना" अपवाद में अनुमति नहीं है।

  1. पहले schema.xsd और file.xml का फ़ाइल पथ जांचें।
  2. आपके XML और XSD (या DTD) में एन्कोडिंग समान होनी चाहिए।
    XML फ़ाइल हेडर: <?xml version='1.0' encoding='utf-8'?>
    XSD फ़ाइल हेडर:<?xml version='1.0' encoding='utf-8'?>
  3. अगर XML डॉक्युमेंट प्रकार के घोषणा से पहले कुछ भी आता है। hello<?xml version='1.0' encoding='utf-16'?>

0

"<Xml से पहले उन सभी अजीब पात्रों को हटा दें" की भावना में, यहां मेरा जावा कोड है, जो बफ़रड्रेडर के माध्यम से इनपुट के साथ अच्छी तरह से काम करता है:

    BufferedReader test = new BufferedReader(new InputStreamReader(fisTest));
    test.mark(4);
    while (true) {
        int earlyChar = test.read();
        System.out.println(earlyChar);
        if (earlyChar == 60) {
            test.reset();
            break;
        } else {
            test.mark(4);
        }
    }

एफडब्ल्यूआईडब्ल्यू, बाइट्स मैं देख रहा था (दशमलव में): 239, 187, 191।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.