Saya memiliki dua aplikasi yang ditulis dalam Java yang berkomunikasi satu sama lain menggunakan pesan XML melalui jaringan. Saya menggunakan parser SAX di ujung penerima untuk mendapatkan kembali data dari pesan. Salah satu persyaratannya adalah menyematkan data biner dalam pesan XML, tetapi SAX tidak menyukai ini. Apakah ada yang tahu bagaimana melakukan ini?
PEMBARUAN: Saya mendapatkan ini berfungsi dengan kelas Base64 dari pustaka codec apache commons , jika ada orang lain yang mencoba sesuatu yang serupa.
sumber
Base64 memang jawaban yang benar tetapi CDATA tidak, yang pada dasarnya mengatakan: "ini bisa jadi apa saja", namun itu tidak boleh sembarang, itu harus berupa data biner yang dikodekan Base64. Skema XML mendefinisikan biner Base 64 sebagai tipe data primitif yang dapat Anda gunakan di xsd Anda.
sumber
xs:base64Binary
tipe data, yang merupakan tipe yang tepat untuk digunakan.Saya mengalami masalah ini minggu lalu. Saya harus membuat serial file PDF dan mengirimkannya, di dalam file XML, ke server.
Jika Anda menggunakan .NET, Anda dapat mengonversi file biner secara langsung ke string base64 dan menyimpannya di dalam elemen XML.
Atau, ada metode yang dibangun langsung ke dalam objek XmlWriter. Dalam kasus khusus saya, saya harus menyertakan namespace tipe data Microsoft:
String abc terlihat seperti ini:
sumber
Saya biasanya menyandikan data biner dengan MIME Base64 atau pengkodean URL .
sumber
Coba encoding / decoding Base64 data biner Anda. Lihat juga bagian CDATA
sumber
Mungkin menyandikannya ke dalam set yang diketahui - sesuatu seperti base 64 adalah pilihan yang populer.
sumber
Semua pengkodean biner-ke-teks akan berhasil. Saya menggunakan sesuatu seperti itu
sumber
Overhead Base64 adalah 33%.
BaseXML untuk overhead XML1.0 hanya 20% . Tapi ini bukan standar dan hanya memiliki implementasi C. Lihat jika Anda khawatir dengan ukuran data. Perhatikan bahwa bagaimanapun browser cenderung menerapkan kompresi sehingga kurang dibutuhkan.
Saya mengembangkannya setelah diskusi di utas ini: Mengkodekan data biner dalam XML: alternatif untuk base64 .
sumber
Meskipun sebagian besar jawaban lainnya baik-baik saja, Anda dapat mencoba metode pengkodean lain yang lebih hemat ruang seperti yEnc. ( yEnc wikipedia link ) Dengan yEnc juga dapatkan kemampuan checksum langsung "di luar kotak". Baca dan tautkan di bawah. Tentu saja, karena XML tidak memiliki tipe yEnc asli, skema XML Anda harus diperbarui untuk mendeskripsikan node yang dikodekan dengan tepat.
Mengapa : Karena strategi pengkodean base64 / 63, uuencode et al. pengkodean meningkatkan jumlah data (overhead) yang perlu Anda simpan dan transfer sekitar 40% (vs. 1-2% yEnc). Bergantung pada apa yang Anda encoding, overhead 40% bisa / menjadi masalah.
yEnc - Abstrak Wikipedia: https://en.wikipedia.org/wiki/YEnc yEnc adalah skema pengkodean biner-ke-teks untuk mentransfer file biner dalam pesan di Usenet atau melalui email. ... Keuntungan tambahan yEnc dibandingkan metode pengkodean sebelumnya, seperti uuencode dan Base64, adalah penyertaan checksum CRC untuk memverifikasi bahwa file yang didekode telah dikirim secara utuh. </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> orang </s>
sumber
Anda juga dapat meng-Uuencode data biner asli Anda. Format ini sedikit lebih tua tetapi melakukan hal yang sama seperti pengkodean base63.
sumber
Jika Anda memiliki kendali atas format XML, Anda harus membalikkan masalahnya. Daripada melampirkan XML biner, Anda harus memikirkan tentang cara melampirkan dokumen yang memiliki banyak bagian, salah satunya berisi XML.
Solusi tradisional untuk ini adalah arsip (mis. Tar). Tetapi jika Anda ingin menyimpan dokumen terlampir Anda dalam format berbasis teks atau jika Anda tidak memiliki akses ke perpustakaan pengarsipan file, ada juga skema standar yang banyak digunakan dalam email dan HTTP yang multipart / * MIME dengan Content-Transfer-Encoding: biner .
Misalnya jika server Anda berkomunikasi melalui HTTP dan Anda ingin mengirim dokumen multibagian, yang primer adalah dokumen XML yang merujuk ke data biner, komunikasi HTTP mungkin terlihat seperti ini:
Seperti dalam contoh di atas, XML merujuk ke data biner dalam multi bagian yang melingkupi dengan menggunakan
cid
skema URI yang merupakan pengenal untuk header Content-Id. Overhead skema ini hanya akan menjadi header MIME. Skema serupa juga dapat digunakan untuk respons HTTP. Tentu saja dalam protokol HTTP, Anda juga memiliki opsi untuk mengirim dokumen multi bagian ke dalam permintaan / tanggapan terpisah.Jika Anda ingin menghindari penggabungan data Anda dalam multi bagian adalah dengan menggunakan URI data:
Tapi ini memiliki overhead base64.
sumber