Saya baru saja mengeluarkan sepotong kode yang saya tulis beberapa bulan yang lalu. Kode mengambil dokumen XML dari server web dan mem-parsingnya menggunakan JAXB. Terakhir kali saya mencobanya bekerja dengan sempurna; sekarang saya mendapatkan pengecualian:

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 50; White spaces are required between publicId and systemId.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)

Melihat sekeliling, ini menunjukkan beberapa masalah dengan data header XML, yaitu <!DOCTYPE ...>. Jawabannya menunjukkan bahwa pernyataan itu menyesatkan: dalam kasus yang dijelaskan, systemId hilang sama sekali, meskipun kesalahan hanya mengeluh tentang spasi kosong yang hilang di depannya.

Namun, jika saya mendapatkan dokumen XML dengan browser web, itu bahkan tidak berisi header <!DOCTYPE ...>.

Mengurai dokumen XML yang saya ambil beberapa bulan yang lalu berfungsi tanpa masalah.

Jika saya membedakan dokumen yang saya ambil hari ini dan yang dari beberapa bulan yang lalu, keduanya persis sama hingga awal elemen root.

0
user149408 17 April 2020, 18:46

1 menjawab

Jawaban Terbaik

Menangkap lalu lintas HTTP akhirnya memberikan jawabannya (koneksi tidak terenkripsi terkadang berguna): Rupanya layanan beralih dari HTTP ke HTTPS dalam beberapa bulan terakhir, dengan URL tetap tidak berubah.

Permintaan ke URL lama dijawab dengan 301 Moved Permanently dan URL baru.

Saat membaca dari URL dengan java.net.URL.openStream(), pengalihan tidak diikuti secara otomatis. Dengan demikian, data yang dikembalikannya bukan XML yang valid, yang mengarah ke pesan kesalahan.

Pelajaran yang dipetik untuk hari ini: Spasi putih diperlukan antara publicId dan systemId sebenarnya hanyalah cara samar untuk mengatakan: Ada yang salah dengan data XML yang Anda berikan, tapi kami tidak repot-repot menggalinya lebih dalam.

1
user149408 17 April 2020, 15:46