GAE- তে পুরোপুরি বৈধ এক্সএমএলকে বিশ্লেষণ করার সময় "বিষয়বস্তু প্রোগলসে অনুমোদিত নয়"


109

আমি গত 48 ঘন্টা ধরে এই একেবারে উত্সাহী বাগের বিরুদ্ধে আমার মাথাটি মারছি, তাই আমি ভেবেছিলাম অবশেষে তোয়ালেটি ফেলে দিয়ে আমার ল্যাপটপটি উইন্ডো থেকে ফেলে দেওয়ার আগে এখানে জিজ্ঞাসা করার চেষ্টা করব।

আমি ডাব্লুএসএস সিম্পলডিবিতে করা একটি কল থেকে প্রতিক্রিয়া এক্সএমএলকে পার্স করার চেষ্টা করছি। প্রতিক্রিয়া আবার ঠিক তারে ফিরে আসছে; উদাহরণস্বরূপ, এটি দেখতে দেখতে হতে পারে:

<?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>

আমি এই এক্সএমএলে পার্সারের সাথে পাস করেছি

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

এবং eventReader.nextEvent();আমি চাই ডেটা পেতে একগুচ্ছ বার কল করুন ।

এখানে উদ্ভট অংশটি - এটি স্থানীয় সার্ভারের অভ্যন্তরে দুর্দান্ত কাজ করে। প্রতিক্রিয়া আসে, আমি এটি পার্স, সবাই খুশি। সমস্যাটি হ'ল আমি যখন গুগল অ্যাপ ইঞ্জিনে কোডটি স্থাপন করি, তখন বহির্গামী অনুরোধটি এখনও কাজ করে এবং এক্সএমএল প্রতিক্রিয়াটি আমার কাছে 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)

আমার ডাবল, ট্রিপল, চতুর্ভুজটি 'অদৃশ্য অক্ষর' বা নন-ইউটিএফ 8 এনকোডেড অক্ষর ইত্যাদির জন্য এই এক্সএমএলটি পরীক্ষা করেছে I কিছুই; এটি প্রতিটি বৈধতা পরীক্ষায় উত্তীর্ণ হয় যে আমি এটি ফেলে দিতে পারি। এমনকি অপরিচিত, এমনকি যদি আমি স্যাকসন ভিত্তিক পার্সার ব্যবহার করি তবে এটি ঘটে - তবে কেবলমাত্র GAE এ, এটি আমার স্থানীয় পরিবেশে সর্বদা সূক্ষ্মভাবে কাজ করে।

সমস্যার জন্য কোডটি সন্ধান করা খুব শক্ত করে তোলে যখন আমি কেবল এমন পরিবেশে ডিবাগারটি চালাতে পারি যা পুরোপুরি কার্যকর হয় (আমি GAE এ দূরবর্তীভাবে ডিবাগ করার কোনও ভাল উপায় পাইনি)। তবুও, আমার কাছে আদিম উপায়গুলি ব্যবহার করে, আমি মিলিয়ন মিলিয়ন পদ্ধতির চেষ্টা করেছি:

  • এক্সএমএল প্রোলগ সহ এবং ছাড়াই
  • নতুন লাইনের সাথে এবং ছাড়াও
  • প্রোলগে "এনকোডিং =" বৈশিষ্ট্য সহ এবং ছাড়াই
  • উভয় নতুন লাইনের শৈলী
  • এইচটিটিপি স্ট্রিমে উপস্থিত চমকপ্রদ তথ্য সহ এবং ছাড়াই

এবং আমি এগুলির বেশিরভাগ একাধিক সংমিশ্রণে চেষ্টা করেছি যেখানে বোঝা গেল যে তারা মিথস্ক্রিয়া করবে - কিছুই না! আমি আমার বুদ্ধি শেষে। এর আগে কেউ কি এর আগে এমন কিছু সমস্যা দেখেছেন আশা করে এর উপর কিছু আলোকপাত করতে পারে?

ধন্যবাদ!


আমাদের সম্ভবত আরও কিছু কোড দেখার দরকার আছে। আর একটি সম্ভাবনা হ'ল স্থানীয়ভাবে এটি GAE থাকাকালীন কমে যাচ্ছে না। কোডটি পার্সারে দেওয়ার আগে আপনি কীভাবে পরিচালনা করছেন?
রোমেন হিপ্পি

আমি চ্যাঙ্কিংয়ের সম্ভাবনাটিকেও বিবেচনা করেছি, তবে পার্সার যে ত্রুটি বার্তাটি ছুঁড়েছে তাতে ঠিক সেখানে পুরো এক্সএমএল রয়েছে (এটি উপরে আটকানো হয়েছে) বলে মনে হয় না। সম্পূর্ণ পরিবর্তিত এসডিকে কোডটি github.com/AdrianP/aws-sdk- for- জাভাতে পাওয়া যাবে (সর্বাধিক সাম্প্রতিক কমিটগুলি দেখুন) তবে সেখানে প্রচুর কোড রয়েছে। আমি খুব শীঘ্রই একটি ছোট ছোট পুনরুত্পাদনযোগ্য নমুনা তৈরি করার চেষ্টা করব, যদিও এটি কঠিন হবে। এটি সফটওয়্যারটির একটি বড় জটিল অংশ ... যদিও আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ! :)
অ্যাড্রিয়ান পেট্রেস্কু


@ রেয়েডওয়াল্ড, আমার মনে হয় না এটি আমার প্রশ্নটি নকল, যেহেতু আমার প্রশ্নটি এর চেয়ে এক বছর আগে পোস্ট করা হয়েছিল :)
অ্যাড্রিয়ান পেট্রেস্কু

1
এটি কীভাবে একটি প্রশ্ন জিজ্ঞাসা করা উচিত তার উদাহরণ হওয়া উচিত, এটি পড়ার মাধ্যমে আমাকে কীভাবে বিকাশকারী হিসাবে ডিবাগ করতে হবে (ধন্যবাদ ওপি)
সুদীপ ভান্ডারী

উত্তর:


129

আপনার এক্সএমএল এবং এক্সএসডি (বা ডিটিডি) এর এনকোডিং আলাদা are
এক্সএমএল ফাইল শিরোলেখ: <?xml version='1.0' encoding='utf-8'?>
এক্সএসডি ফাইল শিরোনাম:<?xml version='1.0' encoding='utf-16'?>

এক্সএমএল ডকুমেন্ট ধরণের ঘোষণার আগে যখন কোনও কিছু আসে তখন এর কারণ হতে পারে এমন আর একটি সম্ভাব্য দৃশ্যাবলী। অর্থাত্ আপনার বাফারে এই জাতীয় কিছু থাকতে পারে:

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

বা এমনকি একটি স্থান বা বিশেষ অক্ষর।

বাইট অর্ডার চিহ্নিতকারী নামে কিছু বিশেষ অক্ষর রয়েছে যা বাফারে থাকতে পারে। পার্সারে বাফার দেওয়ার আগে এটি করুন ...

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

হাই রোমেন, প্রতিক্রিয়াটির জন্য ধন্যবাদ! প্রোলগের আগে (লুকানো অক্ষর সহ) বাফারে যে কোনও কিছুর জন্য আমি বহুবার ডাবল এবং ট্রিপল চেক করেছি কিন্তু সেখানে আর কিছুই নেই। আমি ইউএফএফ -16 এ একটি চেষ্টা করে এনকোডিং দেওয়ার চেষ্টা করব, তবে - কৌতূহলের বাইরে, আপনি কোথায় তথ্য পেয়েছেন যে এক্সএসডি ইউটিএফ -16 ব্যবহার করে?
অ্যাড্রিয়ান পেট্রেস্কু

@ অ্যাড্রিয়ান পেট্রেস্কু দুঃখিত, আপনি কেবল ডিটিডি বা এক্সএসডি ব্যবহার করছেন তা নিশ্চিত হয়ে নিন যে এটি আপনার এক্সএমএলের সাথে মেলে। আপনি এক্সএমএস পার্স করার আগে এটি একটি স্ট্রিংয়ে ক্যাপচার করুন এবং এটি '|' দিয়ে চারদিকে ঘিরে ফেলুন এবং এটি কনসোলে মুদ্রণ করুন। আপনি কিছু অতিরিক্ত চরিত্রের মধ্যে দিয়ে যাচ্ছেন কিনা এটি আপনাকে বলবে।
রোমেন হিপ্পি

আহ, আমি দেখছি :) দুর্ভাগ্যক্রমে আমি এটি চেষ্টা করেছি এবং এটি এই পরিস্থিতিতে এটি হিসাবে উপস্থিত হবে না। যাই হোক ধন্যবাদ!
অ্যাড্রিয়ান পেট্রেস্কু

1
ধন্যবাদ! এটি আমাকেও বাঁচিয়েছে। xml.trim () replaceFirst ( "^ ([\\ ওয়াট]) <", "<")।
স্ট্যাকওভারফ্লো

2
কেউ দয়া করে এটি গ্রহণযোগ্য উত্তর করুন। সরাসরি আমার সমস্যা সমাধান করুন। আমি "বার্তা: <? এক্সএমএল সংস্করণ ...." দিয়ে শুরু হওয়া একটি বার্তাকে পার্স করছিলাম, সমস্যাটি ছিল এক্সএমএল বিটের আগে লেখাটি। ধন্যবাদ :)
রিক জাফে

8

এই ত্রুটি বার্তাটি সর্বদা প্রথম এলিমেন্টের অবৈধ এক্সএমএল সামগ্রীর কারণে ঘটে। উদাহরণস্বরূপ, অতিরিক্ত ছোট বিন্দু "।" এক্সএমএল উপাদানটির শুরুতে।

" <?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

আমি একই সমস্যা ছিল। আমার ক্ষেত্রে এক্সএমএল ফাইলগুলি সি # প্রোগ্রাম থেকে উত্পন্ন হয়েছিল এবং আরও প্রক্রিয়াকরণের জন্য AS400 এ ফিড করা হয়েছিল। কিছু বিশ্লেষণ শনাক্ত করার পরে আমি এক্সএমএল ফাইলগুলি তৈরি করার সময় ইউটিএফ 8 এনকোডিং ব্যবহার করছি যখন জাভ্যাক (এএস 400 এ) "বিওএম ছাড়াই ইউটিএফ 8" ব্যবহার করে। সুতরাং, নীচে উল্লিখিত অনুরূপ অতিরিক্ত কোড লিখতে হয়েছিল:

//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

নোটপ্যাড ++ এ এক্সএমএল ফাইলটি পরীক্ষা করার সময় এবং ফাইলটি সংরক্ষণ করার সময় আমি সমস্যার মুখোমুখি হয়েছি, যদিও আমার শীর্ষে utf-8 xML ট্যাগ ছিল <?xml version="1.0" encoding="utf-8"?>

এনকোডিং (ট্যাব)> ইউটিএফ -8 এ এনকোড সহ নটপ্যাড ++ এ ফাইল সংরক্ষণ করে স্থির হয়েছে: নির্বাচিত (ইউটিএফ -8-বিওমে এনকোড ছিল)


3

এক্সএমএল ঘোষণা মুছে ফেলা এটি সমাধান করেছে

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

2

আমার এক্সএমএল ফাইলে শিরোনামটি দেখতে এমন দেখাচ্ছে:

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

একটি পরীক্ষার ফাইলে, আমি ফাইল বাইটগুলি পড়ছিলাম এবং স্ট্রিং তৈরি করতে ইউটিএফ -8 (এই ফাইলটিতে শিরোনামটি utf-16 ছিল না) হিসাবে ডেটা ডিকোডিং করছি।

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");

আমি ঠিক সূক্ষ্মভাবে ডিজেরিয়াল করতে সক্ষম হয়েছি। সুতরাং রোমেন যেমন উপরে উল্লেখ করেছেন, এনকোডিংগুলি মেলানো দরকার।


1

আমার এক্সএমএল ফাইলে "প্রোগলোগে বিষয়বস্তু অনুমোদিত নয়" নামক একই সমস্যার মুখোমুখি হয়েছি।

সমাধান

প্রথমদিকে আমার মূল ফোল্ডারটি ছিল '# ফাইলের নাম '।

আমি যখন প্রথম অক্ষর '#' সরিয়েছি তখন ত্রুটিটি সমাধান হয়ে গেছে।

# ফাইল ফাইলটি মুছে ফেলার দরকার নেই ... এইভাবে চেষ্টা করুন ..

আনমারশালার পদ্ধতিতে কোনও ফাইল বা ইউআরএল অবজেক্টটি পাস করার পরিবর্তে একটি ফাইলআইপুট স্ট্রিম ব্যবহার করুন।

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

1

অপ্রত্যাশিত কারণ: #ফাইলের পথে চরিত্র

কিছু অভ্যন্তরীণ ত্রুটির কারণে, প্রোগলগুলিতে ত্রুটিযুক্ত সামগ্রীর অনুমতি দেওয়া হয় না যদি ফাইল সামগ্রী নিজেই 100% সঠিক হয় তবে আপনি ফাইলের নাম সরবরাহ করে যাচ্ছেনC:\Data\#22\file.xml

এটি সম্ভবত অন্যান্য বিশেষ অক্ষরের ক্ষেত্রেও প্রযোজ্য হতে পারে।

কীভাবে চেক করবেন: আপনি যদি বিশেষ ফাইল না করে আপনার ফাইলটিকে কোনও পথে নিয়ে যান এবং ত্রুটিটি অদৃশ্য হয়ে যায়, তবে এটি ছিল এই সমস্যা।


1

আমি আজ একই ত্রুটি বার্তা পেয়েছি। সমাধানটি ছিল বিএমটি ছাড়াই ইউটিএফ -8 থেকে বিওএম ছাড়াই ইউটিএফ -8 এ নথিটি পরিবর্তন করা to


আমারো একই ইস্যু ছিল. ফাইল ফর্ম্যাট পরিবর্তন করা সমস্যার সমাধান করেছে। ধন্যবাদ!
কোড_ফিশ

0

আমার ফাঁকা জায়গাগুলির পরিবর্তে একটি ট্যাব চরিত্র ছিল। '\ T' ট্যাবটি প্রতিস্থাপন করা সমস্যার সমাধান করেছে।

নোটপ্যাড ++ এর মতো সম্পাদকে পুরো ডকটি কেটে পেস্ট করুন এবং সমস্ত অক্ষর প্রদর্শন করুন।


0

আমার সমস্যার উদাহরণে, সমাধানটি হ'ল জার্মান আমলাতগুলি (äöü) তাদের এইচটিএমএল-সমতুল্য সাথে প্রতিস্থাপন করা হয়েছিল ...


0

বেলো উপরের কারণগুলি রয়েছে "org.xML.sax.SAXParseException: প্রোগলগুলিতে বিষয়বস্তু অনুমোদিত নয়" ব্যতিক্রম।

  1. প্রথমে স্কিমা.এক্সএসডি এবং ফাইল.এক্সএমএল ফাইলের পাথ পরীক্ষা করুন।
  2. আপনার এক্সএমএল এবং এক্সএসডি (বা ডিটিডি) এর এনকোডিং একই হওয়া উচিত।
    এক্সএমএল ফাইল শিরোলেখ: <?xml version='1.0' encoding='utf-8'?>
    এক্সএসডি ফাইল শিরোনাম:<?xml version='1.0' encoding='utf-8'?>
  3. এক্সএমএল ডকুমেন্ট টাইপের ডিক্লেয়ারেশনের আগে যদি কিছু আসে তবে: hello<?xml version='1.0' encoding='utf-16'?>

0

"<? এক্সএমএল" এর আগে কেবল এই সমস্ত অদ্ভুত চরিত্রগুলি মুছুন, এর প্রবণতায়, এখানে আমার জাভা কোডটি দেওয়া হয়েছে, যা একটি বাফারডারারের মাধ্যমে ইনপুট নিয়ে ভালভাবে কাজ করে:

    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);
        }
    }

এফডাব্লুআইডাব্লু, আমি যে বাইটগুলি দেখছিলাম তা হ'ল (দশমিক in): 239, 187, 191।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.