Aracılığıyla paylaş


XML verilerinin serileştirmesini tanımlama

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

xml veri türünü açıkça veya örtük olarak bir SQL dizesine veya ikili türüne dönüştürürken, xml veri türünün içeriği bu makalede açıklanan kurallara göre serileştirilir.

Serileştirme kodlaması

SQL hedef türü VARBINARY ise, sonuç XML bildirimi olmadan ama öncesinde bir UTF-16 bayt sıra işaretiyle olacak şekilde UTF-16'da seri hale getirilir. Hedef tür çok küçükse bir hata oluşur.

Örneğin:

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

Sonuç şu şekildedir:

0xFFFE3C0094032F003E00

SQL hedef türü NVARCHAR veya NCHAR ise, sonuç UTF-16'da önünde bayt sırası işareti olmadan ve XML bildirimi olmadan serileştirilir. Hedef tür çok küçükse bir hata oluşur.

Örneğin:

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

Sonuç şu şekildedir:

<Δ/>

SQL hedef türü VARCHAR veya CHAR ise sonuç, bayt sırası işareti veya XML bildirimi olmadan veritabanının harmanlama kodu sayfasına karşılık gelen kodlamada seri hale getirilir. Hedef tür çok küçükse veya değer hedef harmanlama kodu sayfasına eşlenemiyorsa bir hata oluşur.

Örneğin:

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

Geçerli harmanlamanın kod sayfası Δ Unicode karakterini gösteremiyorsa veya bunu belirli kodlamada temsil edecekse, bu hataya neden olabilir.

XML sonuçlarını istemci tarafına döndürürken veriler UTF-16 kodlaması ile gönderilir. ardından istemci tarafı sağlayıcı, api kurallarına göre verileri kullanıma sunar.

XML yapılarının seri hale getirilmesi

xml veri türünün içeriği her zamanki gibi serileştirilir. Özellikle, öğe düğümleri öğe işaretlemesine eşlenir ve metin düğümleri metin içeriğine eşlenir. Ancak, karakterlerin hangi koşullarda yazıldığı ve yazılan atomik değerlerin nasıl seri hale getirildiği aşağıdaki bölümlerde açıklanmıştır.

Serileştirme sırasında XML karakterlerinin adlendirilmesi

Her serileştirilmiş XML yapısı yeniden ayrıştırılabilir olmalıdır. Bu nedenle, XML ayrıştırıcısının normalleştirme aşaması boyunca karakterlerin gidiş dönüş özelliğini korumak için bazı karakterlerin bir şekilde serileştirilmesi gerekir. Ancak, belgenin iyi biçimlendirilmesi ve bu nedenle ayrıştırılabilmesi için bazı karakterlerin adlandırılması gerekir. Serileştirme sırasında geçerli olan başlık kuralları şunlardır:

  • Karakterler &, <ve >, bir öznitelik değeri veya öğe içeriğinde yer aldıklarında, sırasıyla her zaman &amp;, &lt;ve &gt;'e dönüştürülür.

  • SQL Server öznitelik değerlerini kapsayan bir tırnak işareti (U+0022) kullandığından, öznitelik değerlerindeki tırnak işareti &quot;olarak adlandırılır.

  • Vekil çift, yalnızca sunucuda dönüştürülürken tek bir sayısal karakter referansı olarak kodlanır. Örneğin, U+D800 U+DF00 vekil çifti &#x00010300;sayısal karakter referansına dönüştürülür.

  • Ayrıştırma sırasında tab (U+0009) ve satır beslemesini (LF, U+000A) normalleştirmeye karşı korumak için, bunlar sırasıyla öznitelik değerlerinin içinde &#x9; ve &#xA; sayısal karakter başvurularına dönüştürülür.

  • Bir satır başı (CR, U+000D) ayrıştırma sırasında normalleştirilmesini önlemek için, hem öznitelik değerleri hem de öğe içeriği içinde &#xD; sayısal karakter başvurusu olarak adlandırılır.

  • Yalnızca beyaz boşluk içeren metin düğümlerini korumak için, genellikle sonuncusu olan beyaz boşluk karakterlerinden biri, sayısal karakter referansı olarak entitilenir. Bu şekilde, ayrıştırma sırasında boşluk işleme ayarından bağımsız olarak, yeniden ayrıştırma, boşluk metin düğümünü korur.

Örneğin:

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));

Sonuç şu şekildedir:

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

Son boşluk koruma kuralını uygulamak istemiyorsanız, xml bir dizeye veya ikili türe dönüştürürken 1 açık DÖNÜŞTÜR seçeneğini kullanabilirsiniz. Örneğin, varlığa dönüştürmeyi önlemek için aşağıdakileri yapabilirsiniz:

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

query() Yöntemi (xml Veri Türü)xml veri türü örneğine neden olur. Bu nedenle, bir dizeye veya ikili türe aktarılan query() yönteminin herhangi bir sonucu, daha önce açıklanan kurallara göre adlandırılır. Adlandırılmamış dize değerlerini almak istiyorsanız bunun yerine value() Metodu (xml Veri Türü) kullanmalısınız. aşağıda query() yönteminin kullanımına bir örnek verilmiştir:

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

Sonuç şu şekildedir:

This example contains an entitized char: .

aşağıda value() yönteminin kullanımına bir örnek verilmiştir:

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

Sonuç şu şekildedir:

This example contains an entitized char: .

Yazılan xml veri türünü seri hale getirme

Yazılan xml veri türü örneği, XML şema türlerine göre yazılan değerler içerir. Bu değerler, XML şema türlerine göre belirlenen formatta, XQuery'nin xs:string'e dönüştürme işleminin ürettiği biçimde serileştirilir. Daha fazla bilgi için bkz. XQueryTür Atama Kuralları.

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

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

Bu, 13,4 dize değerini döndürür.

Ayrıca bkz.