Saya telah memukuli kepala saya terhadap bug yang benar-benar menyebalkan ini selama 48 jam terakhir, jadi saya pikir akhirnya saya menyerah dan mencoba bertanya di sini sebelum saya membuang laptop saya ke luar jendela.
Saya mencoba mengurai XML tanggapan dari panggilan yang saya lakukan ke AWS SimpleDB. Tanggapannya datang kembali dengan baik; misalnya, mungkin terlihat seperti:
<?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>
Saya mengirimkan XML ini ke parser dengan
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
dan menelepon eventReader.nextEvent();
berkali-kali untuk mendapatkan data yang saya inginkan.
Inilah bagian yang aneh - ini berfungsi dengan baik di dalam server lokal. Tanggapannya masuk, saya parse, semua orang senang. Masalahnya adalah saat saya menerapkan kode ke Google App Engine, permintaan keluar masih berfungsi, dan XML responsnya tampak 100% identik dan benar bagi saya, tetapi respons gagal diurai dengan pengecualian berikut:
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)
Saya memiliki double, triple, quadruple memeriksa XML ini untuk 'karakter tak terlihat' atau karakter non-UTF8 yang dikodekan, dll. Saya melihatnya byte-by-byte dalam array untuk byte-order-marks atau sesuatu yang bersifat seperti itu. Tidak ada; itu melewati setiap tes validasi yang bisa saya lakukan. Lebih aneh lagi, itu terjadi jika saya juga menggunakan parser berbasis Saxon - tetapi HANYA pada GAE, ini selalu berfungsi dengan baik di lingkungan lokal saya.
Itu membuat sangat sulit untuk melacak kode untuk masalah ketika saya hanya dapat menjalankan debugger di lingkungan yang bekerja dengan sempurna (saya belum menemukan cara yang baik untuk men-debug dari jarak jauh di GAE). Namun demikian, dengan menggunakan cara primitif yang saya miliki, saya telah mencoba jutaan pendekatan termasuk:
- XML dengan dan tanpa prolog
- Dengan dan tanpa baris baru
- Dengan dan tanpa atribut "encoding =" di prolog
- Keduanya gaya baris baru
- Dengan dan tanpa informasi chunking yang ada di aliran HTTP
Dan saya sudah mencoba sebagian besar dari ini dalam berbagai kombinasi yang masuk akal jika mereka berinteraksi - tidak ada! Aku kehabisan akal. Adakah yang pernah melihat masalah seperti ini sebelumnya yang semoga dapat menjelaskannya?
Terima kasih!
Jawaban:
Pengkodean dalam XML dan XSD (atau DTD) Anda berbeda.
Judul file XML:
<?xml version='1.0' encoding='utf-8'?>
header file XSD:
<?xml version='1.0' encoding='utf-16'?>
Skenario lain yang mungkin menyebabkan ini adalah ketika sesuatu datang sebelum deklarasi tipe dokumen XML. yaitu Anda mungkin memiliki sesuatu seperti ini di buffer:
atau bahkan spasi atau karakter khusus.
Ada beberapa karakter khusus yang disebut penanda urutan byte yang mungkin ada di buffer. Sebelum meneruskan buffer ke Parser, lakukan ini ...
sumber
Pesan kesalahan ini selalu disebabkan oleh konten XML yang tidak valid di elemen awal. Misalnya, titik ekstra kecil “.” di awal elemen XML.
Karakter apa pun sebelum "
<?xml….
" akan menyebabkan di atas " org.xml.sax.SAXParseException: Konten tidak diizinkan dalam prolog " pesan kesalahan.Titik kecil “ . " sebelum
“<?xml….
Untuk memperbaikinya, hapus saja semua karakter aneh itu sebelum
“<?xml“
.Ref: http://www.mkyong.com/java/sax-error-content-is-not-allowed-in-prolog/
sumber
Saya menghadapi masalah yang sama. Dalam kasus saya, file XML dihasilkan dari program c # dan dimasukkan ke dalam AS400 untuk diproses lebih lanjut. Setelah beberapa analisis mengidentifikasi bahwa saya menggunakan pengkodean UTF8 saat membuat file XML sedangkan javac (dalam AS400) menggunakan "UTF8 tanpa BOM". Jadi, harus menulis kode tambahan yang mirip dengan yang disebutkan di bawah ini:
sumber
Saya mengalami masalah saat memeriksa file xml di notepad ++ dan menyimpan file, meskipun saya memiliki tag utf-8 xml teratas sebagai
<?xml version="1.0" encoding="utf-8"?>
Diperbaiki dengan menyimpan file di notpad ++ dengan Encoding (Tab)> Encode in UTF-8: dipilih (sebelumnya Encode in UTF-8-BOM)
sumber
Menghapus deklarasi xml menyelesaikannya
sumber
Di file xml saya, tajuknya terlihat seperti ini:
Dalam file uji, saya membaca file byte dan mendekode data sebagai UTF-8 (tidak menyadari bahwa header dalam file ini adalah utf-16) untuk membuat string.
Ketika saya mencoba deserialisasi string ini menjadi objek, saya melihat kesalahan yang sama:
Saat saya memperbarui baris kedua menjadi
Saya bisa mendesialisasi objek dengan baik. Jadi, seperti yang disebutkan Romain di atas, pengkodean harus cocok.
sumber
Saya menghadapi masalah yang sama yang disebut "Konten tidak diperbolehkan dalam prolog" di file xml saya.
Larutan
Awalnya folder root saya adalah '# Filename '.
Ketika saya menghapus karakter pertama '#', kesalahan teratasi.
Tidak perlu menghapus #filename ... Coba cara ini ..
Alih-alih meneruskan File atau objek URL ke metode unmarshaller, gunakan FileInputStream.
sumber
Alasan tak terduga:
#
karakter di jalur fileKarena beberapa bug internal, kesalahan Konten tidak diperbolehkan dalam prolog juga muncul jika konten file itu sendiri 100% benar tetapi Anda memberikan nama file seperti
C:\Data\#22\file.xml
.Ini mungkin juga berlaku untuk karakter khusus lainnya.
Cara memeriksa: Jika Anda memindahkan file Anda ke jalur tanpa karakter khusus dan kesalahan hilang, maka itulah masalah ini.
sumber
Saya menangkap pesan kesalahan yang sama hari ini. Solusinya adalah mengganti dokumen dari UTF-8 dengan BOM menjadi UTF-8 tanpa BOM
sumber
Saya memiliki karakter tab, bukan spasi. Mengganti tab '\ t' memperbaiki masalah.
Potong dan tempel seluruh dokumen ke editor seperti Notepad ++ dan tampilkan semua karakter.
sumber
Dalam contoh masalah saya, solusinya adalah mengganti umlaut Jerman (äöü) dengan padanan HTML mereka ...
sumber
di bawah ini adalah penyebab di atas pengecualian “org.xml.sax.SAXParseException: Konten tidak diperbolehkan dalam prolog”.
Judul file XML:
<?xml version='1.0' encoding='utf-8'?>
header file XSD:
<?xml version='1.0' encoding='utf-8'?>
hello<?xml version='1.0' encoding='utf-16'?>
sumber
Dalam semangat "hapus saja semua karakter aneh itu sebelum <? Xml", inilah kode Java saya, yang bekerja dengan baik dengan input melalui BufferedReader:
FWIW, byte yang saya lihat adalah (dalam desimal): 239, 187, 191.
sumber