Saya bekerja dengan beberapa XML yang memiliki string seperti:
<node>This is a string</node>
Beberapa string yang saya lewat ke kelenjar akan memiliki karakter seperti &
, #
, $
, dll .:
<node>This is a string & so is this</node>
Ini tidak valid karena &
.
Saya tidak bisa membungkus string ini dalam CDATA karena mereka harus seperti apa adanya. Saya mencoba mencari daftar karakter yang tidak dapat dimasukkan ke dalam node XML tanpa menjadi CDATA.
Dapatkah seseorang mengarahkan saya ke arah orang lain atau memberi saya daftar karakter ilegal?
Jawaban:
Karakter hanya ilegal yang
&
,<
dan>
(serta"
atau'
dalam atribut).Mereka lolos menggunakan entitas XML , dalam hal ini yang Anda inginkan
&
untuk&
.Tapi sungguh, Anda harus menggunakan alat atau pustaka yang menulis XML untuk Anda dan abstrakkan hal semacam ini untuk Anda sehingga Anda tidak perlu khawatir tentang hal itu.
sumber
OK, mari kita pisahkan pertanyaan dari karakter yang:
Jawaban yang diberikan oleh @dolmen dalam " Apa karakter yang tidak valid dalam XML " masih valid tetapi perlu diperbarui dengan spesifikasi XML 1.1.
1. Karakter tidak valid
Karakter yang dijelaskan di sini adalah semua karakter yang diizinkan untuk dimasukkan dalam dokumen XML.
1.1. Dalam XML 1.0
Daftar global dari karakter yang diperbolehkan adalah:
Pada dasarnya, karakter kontrol dan karakter di luar rentang Unicode tidak diperbolehkan. Ini juga berarti bahwa memanggil misalnya entitas karakter

dilarang.1.2. Dalam XML 1.1
Daftar global dari karakter yang diperbolehkan adalah:
Revisi rekomendasi XML ini telah memperluas karakter yang diizinkan sehingga karakter kontrol diizinkan, dan memperhitungkan revisi baru standar Unicode, tetapi yang ini masih tidak diizinkan: NUL (x00) , xFFFE , xFFFF ...
Namun, penggunaan karakter kontrol dan karakter Unicode yang tidak ditentukan tidak disarankan.
Dapat juga diperhatikan bahwa semua parser tidak selalu mempertimbangkan hal ini dan dokumen XML dengan karakter kontrol dapat ditolak.
2. Karakter yang perlu melarikan diri (untuk mendapatkan dokumen yang terbentuk dengan baik):
The
<
harus melarikan diri dengan<
entitas, karena diasumsikan awal tag.The
&
harus melarikan diri dengan&
entitas, karena diasumsikan awal referensi entitasThe
>
harus melarikan diri dengan>
entitas. Itu tidak wajib - tergantung pada konteksnya - tetapi sangat disarankan untuk menghindarinya.The
'
harus melarikan diri dengan'
entitas - wajib di atribut yang didefinisikan dalam tanda kutip tunggal tetapi sangat disarankan untuk selalu menghindarinya.The
"
harus melarikan diri dengan"
entitas - wajib di atribut yang didefinisikan dalam tanda kutip ganda tapi sangat disarankan untuk selalu menghindarinya.sumber
Daftar karakter yang valid ada dalam spesifikasi XML :
sumber
& < > " '
harus melarikan diri dalam konteks tertentu.Ini adalah kode C # untuk menghapus karakter yang tidak valid XML dari string dan mengembalikan string yang valid baru.
sumber
\u10000
dan\u10FFFF
sebagai karakter tunggal karena mereka memerlukan duachar
contoh utf-16 masing-masing, dan menurut dokumen mungkin tidak ada lebih dari 4 digit.[\u10000-\u10FFFF]
kemungkinan besar diuraikan sebagai [\u1000
,0-\u10FF
,F
,F
] yang aneh melihat tetapi hukum.Karakter yang telah diumumkan sebelumnya adalah:
Lihat " Apa karakter khusus dalam XML? " Untuk informasi lebih lanjut.
sumber
Selain jawaban potame, jika Anda ingin melarikan diri menggunakan blok CDATA.
Jika Anda meletakkan teks Anda di blok CDATA maka Anda tidak perlu menggunakan pelolosan . Dalam hal ini, Anda dapat menggunakan semua karakter dalam rentang berikut :
Catatan: Selain itu, Anda tidak diizinkan menggunakan
]]>
urutan karakter. Karena itu akan cocok dengan akhir blok CDATA.Jika masih ada karakter yang tidak valid (mis. Karakter kontrol), maka mungkin lebih baik menggunakan semacam pengkodean (mis. Base64).
sumber
Cara mudah lain untuk lolos dari karakter XML / XHTML yang mungkin tidak diinginkan di C # adalah:
sumber
Cara lain untuk menghapus karakter XML yang salah di C # menggunakan
XmlConvert.IsXmlChar
(Tersedia sejak .NET Framework 4.0)atau Anda dapat memeriksa bahwa semua karakter XML-valid:
.Net Fiddle
Misalnya, simbol tab vertikal (
\v
) tidak valid untuk XML, itu valid UTF-8, tetapi tidak valid XML 1.0, dan bahkan banyak perpustakaan (termasuk libxml2) melewatkannya dan diam-diam menghasilkan XML yang tidak valid.sumber
Singkatnya, karakter yang valid dalam teks adalah:
&
dan<
.>
tidak valid jika mengikuti]]
.Bagian 2.2 dan 2.4 dari spesifikasi XML memberikan jawaban secara terperinci:
Karakter
Data karakter
sumber
" XmlWriter dan karakter ASCII yang lebih rendah " bekerja untuk saya
sumber
Di C #, gunakan
System.Security.SecurityElement.Escape
atauSystem.Net.WebUtility.HtmlEncode
untuk menghindari karakter ilegal ini.sumber
Untuk orang Jawa, Apache memiliki kelas utilitas (
StringEscapeUtils
) yang memiliki metode pembantuescapeXml
yang dapat digunakan untuk melarikan diri karakter dalam string menggunakan entitas XML.sumber
Dalam prosesor XML Woodstox, karakter yang tidak valid diklasifikasikan oleh kode ini:
Sumber dari sini
sumber
Adakah yang mencoba ini
System.Security.SecurityElement.Escape(yourstring)
? Ini akan menggantikan karakter XML yang tidak valid dalam string dengan padanannya yang valid.sumber
Untuk XSL (pada hari yang benar-benar malas) saya menggunakan:
untuk menerjemahkan semua & -signs yang tidak diikuti på amp; untuk yang tepat.
Kami memiliki kasus di mana input berada dalam CDATA tetapi sistem yang menggunakan XML tidak memperhitungkannya. Ini adalah perbaikan yang ceroboh, waspadalah ...
sumber