Bagikan melalui


Menentukan serialisasi data XML

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

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.

Pengkodean 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.

Contohnya:

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.

Contohnya:

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 kolasi target, kesalahan akan muncul.

Contohnya:

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

Ini dapat mengakibatkan kesalahan, jika halaman kode pengurutan saat ini tidak dapat merepresentasikan karakter Unicode Δ, atau akan merepresentasikannya dalam pengkodean 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 di-entitasi untuk mempertahankan kemampuan bolak-balik karakter melalui fase normalisasi dari pengurai XML. Namun, beberapa karakter harus diberi nama sehingga dokumen terbentuk dengan baik dan, oleh karena itu, dapat diurai. Berikut adalah aturan entitasi yang berlaku selama serialisasi:

  • Karakter &, <, dan > selalu diubah menjadi &amp;, &lt;, dan &gt; masing-masing, jika muncul di dalam nilai atribut atau konten elemen.

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

  • Pasangan surrogat diubah menjadi referensi karakter numerik tunggal, saat proses di server saja. Misalnya, pasangan pengganti U+D800 U+DF00 diwakili oleh referensi karakter numerik &#x00010300;.

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

  • Untuk mencegah pengembalian pengangkutan (CR, U+000D) dinormalisasi selama penguraian, diubah menjadi referensi karakter numeriknya dalam bentuk &#xD; baik di dalam nilai atribut maupun konten elemen.

  • Untuk melindungi simpul teks yang hanya berisi spasi kosong, salah satu karakter white-space, umumnya yang terakhir, diubah menjadi referensi karakter numeriknya. Dengan cara ini, penguraian ulang mempertahankan simpul teks spasi putih, terlepas dari pengaturan penanganan spasi putih selama penguraian.

Contohnya:

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 entitisasi, 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 metode query() yang diubah ke tipe string atau biner diwujudkan sesuai dengan aturan yang dijelaskan sebelumnya. Jika Anda ingin mendapatkan nilai string yang tidak diubah menjadi entitas, Anda harus menggunakan Metode value() (Jenis Data xml) 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.

Lihat juga