定義 XML 資料的序列化

適用于: SQL Server Azure SQL 資料庫Azure SQL 受控執行個體

明確或隱含地將 xml 資料類型轉換成 SQL 字串或二進位類型時, xml 資料類型的內容將會根據本文中所述的規則序列化。

序列化編碼

如果 SQL 目標類型是 VARBINARY,其結果會以 UTF-16 序列化,前面有 UTF-16 位元組順序標示,但沒有 XML 宣告。 如果目標類型太小,則會引發錯誤。

例如:

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

以下是結果:

0xFFFE3C0094032F003E00

如果 SQL 目標類型是 NVARCHAR 或 NCHAR,則結果會以 UTF-16 序列化,但前面沒有位元組順序標示,也沒有 XML 宣告。 如果目標類型太小,則會引發錯誤。

例如:

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

以下是結果:

<Δ/>

如果 SQL 目標類型是 VARCHAR 或 CHAR,其結果會以對應於資料庫定序字碼頁的編碼序列化,但沒有位元組順序標示或 XML 宣告。 如果目標型別太小,或值無法對應至目標定序字碼頁,就會引發錯誤。

例如:

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

如果目前的定序字碼頁無法代表 Unicode 字元 },或者它會以特定編碼方式表示它,這可能會導致錯誤。

將 XML 結果傳回至用戶端時,資料是以 UTF-16 編碼格式傳送。 接著,用戶端提供者會根據其 API 規則來公開此資料。

XML 結構的序列化

xml 資料類型的內容以一般方式序列化。 特別是,元素節點是對應到元素標示,而文字節點則對應到文字內容。 不過,下列章節將描述字元在何種情況下實體化,以及具類型的不可部份完成值如何序列化。

序列化期間對 XML 字元進行實體化

每一個已序列化的 XML 結構應該能夠加以重新剖析。 因此,有些字元必須以實體化方式來序列化,以透過 XML 剖析器的正規化階段保留字元的反覆存取功能。 不過,有些字元必須實體化,使文件能夠有完善的格式,以便加以剖析。 以下是在序列化期間所套用的實體化規則:

  • 如果字元 & 、 < 、 和 > 在屬性值或元素內容內發生,則一律會分別實體化為 &amp;&lt; 、 和 &gt;

  • 因為 SQL Server 使用引號 (U+0022) 來括住屬性值,所以屬性值中的引號會實體化成 &quot;

  • 只在伺服器上進行轉換時,Surrogate 字組會實體化成單一數字字元參考。 例如,Surrogate 配對 U+D800 U+DF00 會實體化為數值字元參考 &#x00010300;

  • 為了保護 TAB (U+0009) 和換行 (LF、U+000A) 在剖析期間無法正規化,它們會分別縮排到其數值字元參考 &#x9; ,以及 &#xA; 分別在屬性值內。

  • 若要防止歸位字元 (CR,U+000D) 在剖析期間無法正規化,它會在屬性值和元素內容內,將其數值字元參考 &#xD; 實體化。

  • 為了保護只包含空格的文字節點,其中一個空格字元 (通常是最後一個) 會實體化為其數字字元參考。 如此一來,不論剖析期間的空格處理設定為何,重新剖析作業都會保留空格文字節點。

例如:

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

以下是結果:

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

如果您不想套用最後一個空白字元保護規則,您可以在從 xml 轉換成字串或二進位類型時,使用明確的 CONVERT 選項 1。 例如,若要避免實體化,您可以執行下列動作:

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

query () 方法 (xml 資料類型) 會產生xml資料類型實例。 因此,轉換成字串或二進位類型之方法的任何結果 query() ,會根據先前所述的規則進行實體化。 如果您想要取得未實作的字串值,您應該改用 value () 方法 (xml 資料類型) 。 以下是使用 query() 方法的範例:

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

以下是結果:

This example contains an entitized char: .

以下是使用 value() 方法的範例:

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

以下是結果:

This example contains an entitized char: .

序列化具類型的 xml 資料類型

具類型的 xml 資料類型執行個體根據其 XML 結構描述類型來包含具類型的值。 這些值根據其 XML 結構描述類型而序列化,並使用與 XQuery 轉換成 xs:string 時產生的相同格式。 如需詳細資訊,請參閱 XQuery 中的類型轉換規則

例如,xs:double 值 1.34e1 序列化為 13.4,如下列範例所顯示:

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

這會傳回字串值 13.4。

另請參閱