Sangat mirip dengan pertanyaan ini , kecuali untuk Java.
Apa cara yang direkomendasikan untuk mengenkode string untuk keluaran XML di Java. String tersebut mungkin berisi karakter seperti "&", "<", dll.
Sangat mirip dengan pertanyaan ini , kecuali untuk Java.
Apa cara yang direkomendasikan untuk mengenkode string untuk keluaran XML di Java. String tersebut mungkin berisi karakter seperti "&", "<", dll.
Sangat sederhana: gunakan pustaka XML. Dengan cara itu sebenarnya akan benar alih-alih membutuhkan pengetahuan rinci tentang bit dari spesifikasi XML.
Seperti yang telah disebutkan orang lain, menggunakan pustaka XML adalah cara termudah. Jika Anda memang ingin melarikan diri, Anda dapat melihat
StringEscapeUtils
dari perpustakaan Apache Commons Lang .sumber
StringEscapeUtils.escapeXml(str)
daricommons-lang
. Saya menggunakannya di aplikasi App Engine - bekerja dengan sangat baik. Berikut adalah Java Doc untuk fungsi ini:\t
,\n
dan\r
.\t
,\n
atau\r
perlu di-escape?Gunakan saja.
Ini akan mengizinkan karakter apa pun kecuali akhiran
Jadi, Anda dapat menyertakan karakter yang ilegal seperti & dan>. Sebagai contoh.
Namun, atribut harus di-escape karena blok CDATA tidak dapat digunakan untuknya.
sumber
Ini telah bekerja dengan baik bagi saya untuk memberikan versi escape dari string teks:
sumber
Coba ini:
sumber
t==null
.Pertanyaan ini sudah berusia delapan tahun dan masih belum merupakan jawaban yang sepenuhnya benar! Tidak, Anda tidak perlu mengimpor seluruh API pihak ketiga untuk melakukan tugas sederhana ini. Saran yang buruk.
Metode berikut akan:
Saya telah mencoba mengoptimalkan untuk kasus yang paling umum, sambil tetap memastikan Anda dapat menyalurkan / dev / random melalui ini dan mendapatkan string yang valid dalam XML.
Sunting: bagi mereka yang terus bersikeras bahwa itu bodoh untuk menulis kode Anda sendiri untuk ini ketika ada Java API yang sangat bagus untuk menangani XML, Anda mungkin ingin tahu bahwa StAX API disertakan dengan Oracle Java 8 (saya belum menguji yang lain ) gagal untuk mengenkode konten CDATA dengan benar: tidak lolos]]> urutan dalam konten. Pustaka pihak ketiga, bahkan yang merupakan bagian dari inti Java, tidak selalu merupakan pilihan terbaik.
sumber
StringEscapeUtils.escapeXml()
tidak lolos dari karakter kontrol (<0x20). XML 1.1 memungkinkan karakter kontrol; XML 1.0 tidak. Misalnya,XStream.toXML()
dengan senang hati akan membuat serialisasi karakter kontrol objek Java ke dalam XML, yang akan ditolak oleh parser XML 1.0.Untuk keluar dari karakter kontrol dengan Apache commons-lang, gunakan
sumber
sumber
replaceAll
panggilan sangat tidak efisien, terutama untuk string besar. Setiap panggilan menghasilkan objek String baru yang dibuat, yang akan bertahan sampai sampah dikumpulkan. Juga, setiap panggilan membutuhkan pengulangan melalui string lagi. Ini dapat dikonsolidasikan ke dalam satu loop manual dengan perbandingan terhadap setiap karakter target di setiap iterasi.Sementara idealisme mengatakan menggunakan perpustakaan XML, IMHO jika Anda memiliki ide dasar tentang XML maka akal sehat dan kinerja mengatakan templat itu sepenuhnya. Ini bisa dibilang lebih mudah dibaca juga. Meskipun menggunakan rutinitas melarikan diri dari perpustakaan mungkin adalah ide yang bagus.
Pertimbangkan ini: XML dulu dimaksudkan untuk ditulis oleh manusia.
Gunakan pustaka untuk menghasilkan XML saat menjadikan XML Anda sebagai "objek" yang lebih baik dalam membuat model masalah Anda. Misalnya, jika modul yang dapat dicolok berpartisipasi dalam proses pembuatan XML ini.
Sunting: tentang bagaimana benar-benar melarikan diri dari XML dalam template, penggunaan CDATA atau
escapeXml(string)
dari JSTL adalah dua solusi yang baik,escapeXml(string)
dapat digunakan seperti ini:sumber
Perilaku StringEscapeUtils.escapeXml () telah berubah dari Commons Lang 2.5 menjadi 3.0. Sekarang tidak lagi lolos dari karakter Unicode yang lebih besar dari 0x7f.
Ini adalah hal yang baik, metode lama akan sedikit bersemangat untuk keluar dari entitas yang baru saja disisipkan ke dalam dokumen utf8.
Escaper baru yang akan disertakan dalam Google Guava 11.0 juga tampak menjanjikan: http://code.google.com/p/guava-libraries/issues/detail?id=799
sumber
Bagi mereka yang mencari solusi tercepat untuk menulis: gunakan metode dari apache commons-lang :
StringEscapeUtils.escapeXml10()
untuk xml 1.0StringEscapeUtils.escapeXml11()
untuk xml 1.1StringEscapeUtils.escapeXml()
sekarang tidak digunakan lagi, tetapi digunakan secara umum di masa laluIngatlah untuk memasukkan ketergantungan:
sumber
Catatan: Pertanyaan Anda adalah tentang pelolosan , bukan penyandiaksaraan . Melarikan diri menggunakan <, dll. Untuk memungkinkan pengurai membedakan antara "ini adalah perintah XML" dan "ini adalah beberapa teks". Enkode adalah hal-hal yang Anda tentukan di header XML (UTF-8, ISO-8859-1, dll).
Pertama-tama, seperti yang orang lain katakan, gunakan perpustakaan XML. XML terlihat sederhana tetapi encoding + escaping adalah voodoo gelap (yang akan Anda lihat segera setelah Anda menemukan umlaut dan bahasa Jepang dan hal-hal aneh lainnya seperti " digit lebar penuh " (& # FF11; adalah 1)). Menjaga agar XML dapat dibaca manusia adalah tugas Sisyphus.
Saya menyarankan untuk tidak pernah mencoba menjadi pintar tentang pengkodean teks dan melarikan diri dalam XML. Tetapi jangan biarkan hal itu menghentikan Anda untuk mencoba; ingatlah kapan itu menggigit Anda (dan itu akan terjadi).
Karena itu, jika Anda hanya menggunakan UTF-8, agar lebih mudah dibaca, Anda dapat mempertimbangkan strategi ini:
<![CDATA[ ... ]]>
Saya menggunakan ini di editor SQL dan memungkinkan pengembang untuk memotong & menempelkan SQL dari alat SQL pihak ketiga ke XML tanpa khawatir akan kabur. Ini berfungsi karena SQL tidak dapat berisi umlaut dalam kasus kami, jadi saya aman.
sumber
Meskipun pada prinsipnya saya setuju dengan Jon Skeet, terkadang saya tidak memiliki opsi untuk menggunakan pustaka XML eksternal. Dan saya merasa aneh dua fungsi untuk melarikan diri / unescape nilai sederhana (atribut atau tag, bukan dokumen lengkap) tidak tersedia di pustaka XML standar yang disertakan dengan Java.
Akibatnya dan berdasarkan jawaban berbeda yang saya lihat diposting di sini dan di tempat lain, berikut adalah solusi yang akhirnya saya buat (tidak ada yang berfungsi sebagai salin / tempel sederhana):
Hal di atas mengakomodasi beberapa hal berbeda:
Pada titik tertentu, saya akan menulis inversi fungsi ini, toUnescaped (). Saya hanya tidak punya waktu untuk melakukan itu hari ini. Ketika saya melakukannya, saya akan memperbarui jawaban ini dengan kode. :)
sumber
null
karakternya. Bisakah Anda menjelaskan definisi kedua nilai,UNICODE_LOW
danUNICODE_HIGH
? Harap baca ulangif
yang menggunakan dua nilai tersebut. Perhatikannull
(\u0000
yang mana(int)0
) tidak berada di antara kedua nilai ini. Bacalah bagaimana itu menjadi "lolos" dengan benar seperti SEMUA karakter Unicode yang ada di luar rentangUNICODE_LOW
danUNICODE_HIGH
, dengan menggunakan&#
teknik ini.Untuk menghindari karakter XML, cara termudah adalah dengan menggunakan proyek Apache Commons Lang, JAR dapat diunduh dari: http://commons.apache.org/lang/
Kelasnya adalah ini: org.apache.commons.lang3.StringEscapeUtils;
Ini memiliki metode bernama "escapeXml", yang akan mengembalikan String yang di-escape dengan tepat.
sumber
Jika Anda mencari perpustakaan untuk menyelesaikan pekerjaan, coba:
Jambu biji 26.0 didokumentasikan di sini
return XmlEscapers.xmlContentEscaper().escape(text);
Apache Commons Text 1.4 didokumentasikan di sini
StringEscapeUtils.escapeXml11(text)
sumber
Berikut adalah solusi yang mudah dan bagus untuk mengenkode karakter beraksen juga!
Keluaran
sumber
Anda dapat menggunakan pustaka Enterprise Security API (ESAPI) , yang menyediakan metode seperti
encodeForXML
danencodeForXMLAttribute
. Lihat dokumentasi antarmuka Encoder ; itu juga berisi contoh bagaimana membuat sebuah instance dari DefaultEncoder .sumber
Ganti saja
Dan untuk karakter lain:
sumber
Gunakan JAXP dan lupakan tentang penanganan teks, itu akan dilakukan untuk Anda secara otomatis.
sumber
Cobalah untuk menyandikan XML menggunakan Apache XML serializer
sumber
Inilah yang saya temukan setelah mencari di mana-mana mencari solusi:
Dapatkan perpustakaan Jsoup:
Kemudian:
Semoga ini bisa membantu seseorang
sumber