Menentukan serialisasi data XML

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Saat mentransmisikan jenis data xml secara eksplisit atau implisit ke string SQL atau jenis biner, konten tipe data xml akan diserialisasikan sesuai dengan aturan yang diuraikan dalam artikel ini.

Pengodean serialisasi

Jika jenis target SQL adalah VARBINARY, hasilnya diserialisasikan dalam UTF-16 dengan tanda urutan UTF-16-byte di depan, tetapi tanpa deklarasi XML. Jika jenis target terlalu kecil, kesalahan akan muncul.

Misalnya:

select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))

Ini adalah hasilnya:

0xFFFE3C0094032F003E00

Jika jenis target SQL adalah NVARCHAR atau NCHAR, hasilnya diserialisasikan dalam UTF-16 tanpa tanda urutan byte di depan dan tanpa deklarasi XML. Jika jenis target terlalu kecil, kesalahan akan muncul.

Misalnya:

select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))

Ini adalah hasilnya:

<Δ/>

Jika jenis target SQL adalah VARCHAR atau CHAR, hasilnya diserialisasikan dalam pengodean yang sesuai dengan halaman kode kolase database tanpa tanda urutan byte atau deklarasi XML. Jika jenis target terlalu kecil atau nilai tidak dapat dipetakan ke halaman kode kolase target, kesalahan akan muncul.

Misalnya:

select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))

Ini dapat mengakibatkan kesalahan, jika halaman kode kolake saat ini tidak dapat mewakili karakter Unicode Δ, atau akan mewakilinya dalam pengodean tertentu.

Saat mengembalikan hasil XML ke sisi klien, data akan dikirim dalam pengodean UTF-16. Penyedia sisi klien kemudian akan mengekspos data sesuai dengan aturan API-nya.

Serialisasi struktur XML

Konten jenis data xml diserialisasikan dengan cara yang biasa. Secara khusus, node elemen dipetakan ke markup elemen, dan node teks dipetakan ke konten teks. Namun, keadaan di mana karakter diberi izin dan bagaimana nilai atom yang diketik diserialisasikan dijelaskan di bagian berikut.

Pemberian entitas karakter XML selama serialisasi

Setiap struktur XML berseri harus mampu direparasi. Oleh karena itu, beberapa karakter harus diserialisasikan dengan cara yang berhak untuk mempertahankan kemampuan pulang pergi karakter melalui fase normalisasi pengurai XML. Namun, beberapa karakter harus diberi nama sehingga dokumen terbentuk dengan baik dan, oleh karena itu, dapat diurai. Berikut ini adalah aturan pemberian izin yang berlaku selama serialisasi:

  • Karakter &, <, dan > selalu berhak untuk &amp;, &lt;, dan &gt; masing-masing, jika terjadi di dalam nilai atribut atau konten elemen.

  • Karena SQL Server menggunakan tanda kutip (U+0022) untuk mengapit nilai atribut, tanda kutip dalam nilai atribut berhak sebagai &quot;.

  • Pasangan pengganti berhak sebagai referensi karakter numerik tunggal, saat transmisi di server saja. Misalnya, pasangan pengganti U+D800 U+DF00 berhak atas referensi &#x00010300;karakter numerik .

  • Untuk melindungi TAB (U+0009) dan linefeed (LF, U+000A) agar tidak dinormalisasi selama penguraian, mereka berhak atas referensi &#x9; karakter numerik mereka dan &#xA; masing-masing, di dalam nilai atribut.

  • Untuk mencegah pengembalian pengangkutan (CR, U+000D) dinormalisasi selama penguraian, itu berhak atas referensi karakter numeriknya, &#xD; di dalam nilai atribut dan konten elemen.

  • Untuk melindungi simpul teks yang hanya berisi spasi kosong, salah satu karakter spasi putih, umumnya yang terakhir, berhak sebagai referensi karakter numeriknya. Dengan cara ini, membandingkan ulang mempertahankan simpul teks spasi putih, terlepas dari pengaturan penanganan spasi putih selama penguraian.

Misalnya:

DECLARE @u NVARCHAR(50)
set @u = N'<a a="
    '+NCHAR(0xD800)+NCHAR(0xDF00)+N'>">   '+NCHAR(0xA)+N'</a>'
SELECT CAST(CONVERT(XML,@u,1) as NVARCHAR(50));

Ini adalah hasilnya:

<a a="
    𐌀>">
</a>

Jika Anda tidak ingin menerapkan aturan perlindungan spasi putih terakhir, Anda dapat menggunakan opsi CONVERT eksplisit 1 saat mentransmisikan dari xml ke string atau jenis biner. Misalnya, untuk menghindari pemberian izin, Anda dapat melakukan hal berikut:

SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a>   </a>', 1), 1);

Metode kueri() (Tipe Data xml) menghasilkan instans jenis data xml . Oleh karena itu, setiap hasil dari query() metode yang dilemparkan ke string atau jenis biner diberikan sesuai dengan aturan yang dijelaskan sebelumnya. Jika Anda ingin mendapatkan nilai string yang tidak berhak, Anda harus menggunakan metode value() (xml Jenis Data) sebagai gantinya. Berikut ini adalah contoh penggunaan query() metode :

DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: .</a>'
SELECT @x.query('/a/text()');

Ini adalah hasilnya:

This example contains an entitized char: .

Berikut ini adalah contoh penggunaan value() metode :

SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');

Ini adalah hasilnya:

This example contains an entitized char: .

Menserialisasikan jenis data xml yang ditik

Instans jenis data xml yang diketik berisi nilai yang diketik sesuai dengan jenis skema XML mereka. Nilai-nilai ini diserialisasikan sesuai dengan jenis skema XML mereka dalam format yang sama dengan yang dihasilkan XQuery cast ke xs:string. Untuk informasi selengkapnya, lihat Mengetik Aturan Casting di XQuery.

Misalnya, nilai xs:double 1.34e1 diserialisasikan ke 13,4 seperti yang ditunjukkan dalam contoh berikut:

declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));

Ini mengembalikan nilai string 13.4.

Baca juga