Saya bertanya-tanya apakah ada cara untuk menghindari token end CDATA (]]>
) dalam bagian CDATA dalam dokumen xml. Atau, lebih umum, jika ada beberapa urutan melarikan diri untuk digunakan dalam CDATA (tetapi jika ada, saya kira itu mungkin hanya masuk akal untuk melarikan diri mulai atau mengakhiri token, toh).
Pada dasarnya, dapatkah Anda memiliki token awal atau akhir yang tertanam dalam CDATA dan memberi tahu parser untuk tidak menafsirkannya tetapi memperlakukannya hanya sebagai urutan karakter lain.
Mungkin, Anda harus memperbaiki struktur xml atau kode Anda jika Anda berusaha melakukannya, tetapi meskipun saya telah bekerja dengan xml setiap hari selama sekitar 3 tahun terakhir dan saya tidak pernah mengalami masalah ini, Saya bertanya-tanya apakah itu mungkin. Hanya karena penasaran.
Edit:
Selain menggunakan pengodean html ...
>
seperti>
dalam CData untuk memastikan tertanam]]>
tidak akan diuraikan sebagai CDEnd. Ini hanya berarti itu tidak terduga dan itu&
harus PERTAMA dikodekan&
juga sehingga data dapat diterjemahkan dengan benar. Pengguna dokumen juga harus tahu untuk memecahkan kode CData ini. Ini tidak pernah terdengar sejak bagian dari tujuan CData adalah untuk mengandung konten yang dipahami oleh konsumen tertentu. CData semacam itu tidak bisa diharapkan ditafsirkan dengan benar oleh konsumen generik mana pun.CDATA
dirancang untuk memungkinkan apa saja : mereka digunakan untuk keluar dari blok teks yang mengandung karakter yang jika tidak akan dikenali sebagai markup ItuCDATA
juga berarti karena itu juga markup. Tapi, sebenarnya, Anda tidak perlu pengkodean ganda yang saya maksudkan.]]>
adalah cara yang dapat diterima untuk pengkodeanCDEnd
dalamCDATA
.Jawaban:
Jelas, pertanyaan ini murni bersifat akademis. Untungnya, ia memiliki jawaban yang sangat pasti.
Anda tidak dapat menghindari urutan akhir CDATA. Aturan produksi 20 dari spesifikasi XML cukup jelas:
EDIT: Aturan produk ini secara harfiah berarti "Bagian CData dapat berisi apa pun yang Anda inginkan TETAPI urutan ']]>'. Tidak terkecuali.".
EDIT2: Bagian yang sama juga berbunyi:
Dengan kata lain, itu tidak mungkin untuk menggunakan referensi entitas, markup, atau bentuk sintaks yang ditafsirkan lainnya. Satu-satunya teks yang diuraikan di dalam bagian CDATA adalah
]]>
, dan itu mengakhiri bagian.Karenanya, tidak mungkin untuk melarikan diri
]]>
dalam bagian CDATA.EDIT3: Bagian yang sama juga berbunyi:
Kemudian mungkin ada bagian CDATA di mana saja data karakter dapat terjadi, termasuk beberapa bagian CDATA yang berdekatan di tempat bagian CDATA tunggal. Itu memungkinkan untuk memisahkan
]]>
token dan meletakkan kedua bagian itu di bagian CDATA yang berdekatan.ex:
harus ditulis sebagai
sumber
<script>/*<![CDATA[*/javascript goes here/*]]>*/</script>
dan javascript saya hanya mencakup urutan itu! Saya suka gagasan untuk memecah menjadi beberapa bagian CDATA ...[[United States dollar|US$]]>100 million (2013)
yang diterjemahkan[[United States dollar|US$]]>100 million (2013)
oleh pembaca dan penulis memilih untuk menggunakan CDATA untuk menghindari teks dan gagal.Anda harus memecah data Anda menjadi beberapa bagian untuk menyembunyikannya
]]>
.Ini semuanya:
<![CDATA[]]]]><![CDATA[>]]>
Pertama
<![CDATA[]]]]>
memiliki]]
. Yang kedua<![CDATA[>]]>
memiliki>
.sumber
]]>
sebagai]]]]><![CDATA[>
. 5 kali panjangnya ... wow. Tapi kemudian, itu urutan yang tidak biasa.Anda tidak melarikan diri
]]>
tetapi Anda melarikan diri>
setelah]]
dengan memasukkan]]><![CDATA[
sebelum>
, pikirkan ini seperti\
dalam string C / Java / PHP / Perl tetapi hanya diperlukan sebelum>
dan sesudah]]
.BTW,
Jawaban S.Lott sama dengan ini, hanya kata-kata yang berbeda.
sumber
]]]]><![CDATA[>
bukan beberapa urutan ajaib untuk]]>
.]]]]>
memiliki]]
karakter sebagai data, dan]]>
mengakhiri bagian CDATA saat ini.<![CDATA[>
memulai bagian CDATA baru dan memasukkannya ke>
dalam. Mereka sebenarnya adalah dua elemen yang berbeda dan akan diperlakukan secara berbeda ketika bekerja dengan parser DOM. Anda harus sadar akan hal itu. Cara melakukannya mirip dengan]]]><![CDATA[]>
, kecuali menempatkan CDATA]
pertama dan]>
kedua. Perbedaannya tetap.Jawaban S. Lott benar: Anda tidak menyandikan tag akhir, Anda memecahnya di beberapa bagian CDATA.
Cara mengatasi masalah ini di dunia nyata: menggunakan editor XML untuk membuat dokumen XML yang akan dimasukkan ke dalam sistem manajemen konten, cobalah menulis artikel tentang bagian CDATA. Trik biasa Anda menanamkan sampel kode di bagian CDATA akan mengecewakan Anda di sini. Anda bisa bayangkan bagaimana saya belajar ini.
Namun dalam sebagian besar keadaan, Anda tidak akan menemukan ini, dan inilah sebabnya: jika Anda ingin menyimpan (katakanlah) teks dokumen XML sebagai konten elemen XML, Anda mungkin akan menggunakan metode DOM, misalnya:
Dan DOM cukup lolos dari <dan>, yang berarti bahwa Anda belum secara tidak sengaja memasukkan bagian CDATA dalam dokumen Anda.
Oh, dan ini menarik:
Ini mungkin ideosinkrasi dari. NET DOM, tapi itu tidak membuang pengecualian. Pengecualian akan dibuang di sini:
Saya kira apa yang terjadi di bawah tenda adalah bahwa XmlDocument menggunakan XmlWriter menghasilkan outputnya, dan XmlWriter memeriksa bentuk yang baik ketika ia menulis.
sumber
cukup ganti
]]>
dengan]]]]><![CDATA[>
sumber
Inilah kasus lain yang
]]>
harus diloloskan. Misalkan kita perlu menyimpan dokumen HTML yang benar-benar valid di dalam blok CDATA dari dokumen XML dan sumber HTML kebetulan memiliki blok CDATA itu sendiri. Sebagai contoh:sufiks CDATA yang dikomentari perlu diubah menjadi:
karena parser XML tidak akan tahu cara menangani blok komentar javascript
sumber
]]>
dengan yang]]]]><![CDATA[>
masih berlaku di sini. Fakta bahwa itu JavaScript, atau komentar tidak penting.Dalam PHP:
'<![CDATA['.implode(explode(']]>', $string), ']]]]><![CDATA[>').']]>'
sumber
Cara yang lebih bersih di PHP:
Jangan lupa untuk menggunakan str_replace multibyte-safe jika diperlukan (non latin1
$string
):sumber
Saya tidak berpikir bahwa menginterupsi CDATA adalah cara yang baik untuk pergi. Inilah alternatif saya ...
Gunakan
]
untuk urutan pelarian diikuti oleh nilai hex karakter Anda. Seperti di&#xhhhh;
=>]<unicode value>;
Dengan cara ini jika Anda mencoba untuk merekam
]]>
encode Anda fn akan menghasilkan]005D;]005D;]003E;
yang ok di CDATA.Ini lebih baik daripada melarikan diri dengan nama entitas, karena itu tidak diterjemahkan setiap kali di aplikasi Anda dan Anda mungkin memiliki prioritas yang berbeda untuk melarikan diri entitas dengan ampersand vs melarikan diri beberapa karakter / urutan lainnya. Akibatnya, Anda memiliki kontrol lebih besar atas konten CDATA.
sumber
Lihat struktur ini:
Untuk tag CDATA bagian dalam yang harus Anda tutup
]]]]><![CDATA[>
bukan]]>
. Sederhana seperti itu.sumber