XML veri'seri hale getirme

Bir SQL dizesi veya ikili türü için xml veri türünü açıkça veya örtük olarak çevrim, bu konuda anlatılan kurallara uygun şekilde içeriğini xml veri türü serileştirilmesi.

Seri hale getirme kodlama

SQL hedef türü VARBINARY, UTF-16 önde UTF-16-bayt sırası işareti, ancak bir XML bildirim sonucu serileştirilir.Hedef türü çok küçükse, bir hata ortaya çıkar.

Örneğin:

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

Bu sonucu oluşur:

0xFFFE3C0094032F003E00

SQL hedef türü DEPARTMENTNAME veya NCHAR, sonuç UTF-16 bayt sırası işareti önüne ve bir XML bildirim serileştirilir.Hedef türü çok küçükse, bir hata ortaya çıkar.

Örneğin:

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

Bu sonucu oluşur:

<Δ/>

SQL hedef türü VARCHAR veya NCHAR, karşılık gelen bayt düzeni işareti veya XML bildirim veritabanı harmanlama kod sayfa için kodlamayı sonuç serileştirilir.Hedef türü çok küçük veya değeri hedef harmanlama kod sayfa eşlenemez, bir hata ortaya çıkar.

Örneğin:

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

Bu işlem geçerli harmanlama'nın kod sayfa, Unicode karakter Δ temsil yapamaz ya da, bu belirli kodlama içinde temsil eder, hataya neden olabilir.

Istemci tarafı için XML sonuçlar döndüren, verileri UTF-16 gönderilir kodlama.Istemci tarafı sağlayıcı verileri API kurallarını sonra harekete geçirecek.

Seri hale getirme XML yapıları

Içeriği bir XML veri türü, her zamanki biçiminde seri hale.Özellikle, öğe düğümleri için öğe biçimlendirme eşleştirilir ve metin düğümlerin metin içeriği eşleştirilir.Ancak, hangi karakterlerin entitized ve nasıl yazılı atomik değerleri koşullarda sıralanmış aşağıdaki bölümlerde açıklanmıştır.

Seri hale getirme sırasında XML karakterleri entitization

Her seri hale getirilmiş XML yapısını reparsed yeteneğine sahip olması gerekir.Bu nedenle, bazı karakterler, karakterleri XML parser'ın normalleştirme aşaması boyunca gidiş dönüş yeteneği korumak için entitized yol seri hale getirilmek üzere bulunmaktadır.Ancak, bazı karakterler entitized belgenin iyi biçimlendirilmiş olması gerekir ve bu nedenle, ayrıştırılması yapabilir.Seri hale getirme sırasında uygulanan entitization kurallar şunlardır:

  • Karakterleri &, <, ve > her zaman için entitized &amp; &lt; ve &gt sırasıyla; bunlar bir öznitelik değeri veya öğenin içeriği içinde gerçekleşirse.

  • Için (U + 0022) SQL Server kullanan bir tırnak işareti için öznitelik değerleri, özniteliğin değerleri tırnak işareti içine olarak entitized &quot;.

  • Bir yedek çifti yalnızca sunucu üzerinde çevrim, bir tek sayısal karakter başvurusu olarak entitized.Örneğin, yedek çifti U + D800 U + DF00 sayısal karakter başvurusu entitized &# x 00010300;.

  • Bir SEKME korumak için (U + 0009) ve satır besleme (LF, U + 000A) çözümlenmesi sırasında normalleştirilmiş gelen, bunlar için kendi sayısal karakter başvuruları entitized &# 9 x; ve &#xA; öznitelik değerleri sırasıyla içinde.

  • Ayrıştırma sırasında normalleştirilmiş gelen bir satır başı (CR, U + 000 D) engellemek için , onu kendi sayısal karakter başvurusu entitized &#xD; iç her ikisi de değerler ve öğe içeriği özniteliği.

  • Yalnızca boşluk içeren metin düğümlerin korumak için , beyaz boşluk karakterleri, genellikle son bir birini kendi sayısal karakter başvurusu entitized.Bu yolla, reparsing çözümlenmesi sırasında işleme beyaz boşluk ayarı ne olursa olsun beyaz boşluk metin düğümü korur.

Örneğin:

declare @u NVARCHAR(50)
set @u = N'<a a="&#xD;&#x9;'+NCHAR(0xD800)+NCHAR(0xDF00)+N'>">   '+NCHAR(0xA)+N'</a>'
select CAST(CONVERT(XML,@u,1) as NVARCHAR(50))

Bu sonucu oluşur:

<a a="&#xD;&#x9;&#x00010300;&gt;">   &#xA;</a>

Son beyaz boşluk koruma kural uygulamak istediğiniz, açık CONVERT seçenek 1 arasında çevrim sırasında kullanabilirsiniz XML bir dize veya ikili türü.Örneğin, entitization önlemek için , aşağıdakileri:

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

Unutmayın, Query() Yöntem (xml veri türü) sonuçlar bir xml veri örnek yazın.Bu nedenle, tüm sonuç Query() bir dize veya ikili türüne atama yöntem, yukarıda açıklanan kurallarına göre entitized.Değil entitized dize değerlerini almak istediğiniz zaman kullanmalısınız, Value() Yöntem (xml veri türü) yerine.Aşağıdakileri kullanarak, bir örnektir Query() yöntem:

declare @x xml
set @x = N'<a>This example contains an entitized char: &lt;.</a>'
select @x.query('/a/text()')

Bu sonucu oluşur:

This example contains an entitized char: &lt;.

Aşağıdakileri kullanarak, bir örnektir Value() yöntem:

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

Bu sonucu oluşur:

This example contains an entitized char: <.

Bir yazılı xml veri türü seri hale getiriliyor

Yazılı bir XML veri türü örnek göre bir XML şema türleri yazılan değerleri içerir.Için xs:dize artığını XQuery üreten gibi tipine göre XML Şeması aynı biçimde bu değerleri sıralanmış.Daha fazla bilgi için bkz:XQuery'da türü çevrim kuralları.

Örneğin, xs:double değeri 1.34e1 13.4 için aşağıdaki örnekte gösterildiği gibi serileştirilir:

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

Bu dize değeri 13.4 döndürür.