XML データのシリアル化の定義Define the Serialization of XML Data

適用対象: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

XML データ型を SQL 文字列型やバイナリ型に明示的または暗黙にキャストすると、XML データ型のコンテンツはこのトピックで説明する規則に従ってシリアル化されます。When casting the xml data type explicitly or implicitly to a SQL string or binary type, the content of the xml data type will be serialized according to the rules outlined in this topic.

シリアル化のエンコードSerialization Encoding

SQL の対象型が VARBINARY の場合、結果は UTF-16 バイト順マークを前に付け、XML 宣言を付けずに、UTF-16 でシリアル化されます。If the SQL target type is VARBINARY, the result is serialized in UTF-16 with a UTF-16-byte order mark in front, but without an XML declaration. 対象型が小さすぎる場合は、エラーが発生します。If the target type is too small, an error is raised.

例:For example:

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

結果を次に示します。This is the result:

0xFFFE3C0094032F003E00  

SQL の対象型が NVARCHAR または NCHAR の場合、結果はバイト順マークを前に付けず、XML 宣言を付けずに、UTF-16 でシリアル化されます。If the SQL target type is NVARCHAR or NCHAR, the result is serialized in UTF-16 without the byte order mark in front and without an XML declaration. 対象型が小さすぎる場合は、エラーが発生します。If the target type is too small, an error is raised.

例:For example:

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

結果を次に示します。This is the result:

<Δ/>  

SQL の対象型が VARCHAR または NCHAR の場合、結果はバイト順マークまたは XML 宣言を付けずに、データベースの照合順序のコード ページに対応するエンコードでシリアル化されます。If the SQL target type is VARCHAR or NCHAR, the result is serialized in the encoding that corresponds to the database's collation code page without a byte order mark or XML declaration. 対象型が小さすぎるか、または対象の照合順序のコード ページに値をマップできない場合、エラーが発生します。If the target type is too small or the value cannot be mapped to the target collation code page, an error is raised.

例:For example:

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

現在の照合順序のコード ページで Unicode 文字 Δ を表すことができない場合、エラーになる可能性があります。または、特定のエンコードで表されることになります。This may result in an error, if the current collation's code page cannot represent the Unicode character Δ, or it will represent it in the specific encoding.

XML の結果がクライアント側に返されるときは、UTF-16 エンコードでデータが送信されます。When returning XML results to the client side, the data will be sent in UTF-16 encoding. クライアント側のプロバイダーでは、API の規則に従ってデータを公開します。The client-side provider will then expose the data according to its API rules.

XML 構造のシリアル化Serialization of the XML Structures

xml データ型のコンテンツは、通常の方法でシリアル化されます。The content of an xml data type is serialized in the usual way. 具体的には、要素ノードは要素マークアップにマップされ、テキスト ノードはテキスト コンテンツにマップされます。Specifically, element nodes are mapped to element markup, and text nodes are mapped to text content. ただし、文字がエンティティに変換される状況、および型指定されたアトミック値がシリアル化される方法については、次に説明します。However, the circumstances under which characters are entitized and how typed atomic values are serialized are described in the following sections.

シリアル化中の XML 文字のエンティティ変換Entitization of XML Characters During Serialization

シリアル化されたすべての XML 構造は再解析が可能である必要があります。Every serialized XML structure should be capable of being reparsed. したがって、XML パーサーの正規化フェーズ中に引き続き文字を互いにやり取りできるようにするには、一部の文字をエンティティに変換する方法でシリアル化する必要があります。Therefore, some characters have to be serialized in an entitized way to preserve the round-trip capability of the characters through the XML parser's normalization phase . ただし、一部の文字をエンティティに変換する場合は、ドキュメントが整形式になり、解析可能になるようにする必要があります。However, some characters have to be entitized so that the document is well-formed and, therefore, able to be parsed. 次に、シリアル化中に適用されるエンティティ変換の規則を示します。Following are the entitization rules that apply during serialization:

  • &、<、> の文字が属性値や要素のコンテンツ内に出現する場合、常に、それぞれ &、<、> にエンティティ変換されます。The characters &, <, and > are always entitized to &, <, and > respectively, if they occur inside an attribute value or element content.

  • SQL Server では属性値を囲むために引用符 (U+0022) が使用されるので、属性値の引用符は "にエンティティ変換されます。Because SQL Server uses a quotation mark (U+0022) for enclosing attribute values, the quotation mark in attribute values is entitized as ".

  • サーバーのみでキャストする場合は、サロゲート ペアが 1 つの数字参照としてエンティティ変換されます。A surrogate pair is entitized as a single numeric character reference, when casting on the server only. たとえば、サロゲート ペア U+D800 U+DF00 は、数字参照 &#x00010300; にエンティティ変換されます。For example the surrogate pair U+D800 U+DF00 is entitized to the numeric character reference &#x00010300;.

  • タブ (TAB, U+0009) とラインフィード (LF, U+000A) は、解析時に正規化されないように、属性値の内部でそれぞれ数字参照 &#x9; および &#xA; にエンティティ変換されます。To protect a TAB (U+0009) and a linefeed (LF, U+000A) from being normalized during parsing, they are entitized to their numeric character references &#x9; and &#xA; respectively, inside attribute values.

  • キャリッジ リターン (CR, U+000D) は、解析時に正規化されないように、属性値と要素のコンテンツの両方の内部で数字参照 &#xD; にエンティティ変換されます。To prevent a carriage return (CR, U+000D) from being normalized during parsing, it is entitized to its numeric character reference, &#xD; inside both attribute values and element content.

  • 空白文字だけが含まれているテキスト ノードを保護するために、空白文字の 1 つ (通常は最後の空白文字) が数字参照としてエンティティ変換されます。To protect text nodes that only contain white space, one of the white-space characters, generally the last one, is entitized as its numeric character reference. このようにすると、解析時の空白文字の処理の設定とは無関係に、再解析時に空白文字のテキスト ノードが保持されます。In this way, reparsing preserves the white-space text node, regardless of the setting of the white-space handling during parsing.

例:For example:

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

結果を次に示します。This is the result:

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

最後の空白文字の保護規則を適用しない場合は、 xml から文字列型またはバイナリ型にキャストするときに、CONVERT オプションを明示的に 1 に設定できます。If you do not want to apply the last white-space protection rule, you can use the explicit CONVERT option 1 when casting from xml to a string or binary type. たとえば、エンティティ変換が行われないように、次のように設定できます。For example, to avoid entitization, you can do the following:

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

query() メソッド (XML データ型) の結果は、XML データ型のインスタンスになることに注意してください。Note that, the query() Method (xml Data Type) results in an xml data type instance. したがって、文字列型またはバイナリ型にキャストされる query() メソッドの結果は、上記の規則に従ってエンティティに変換されます。Therefore, any result of the query() method that is cast to a string or binary type is entitized according to the previously described rules. エンティティに変換されていない文字列値を取得する場合は、代わりに value() メソッド (XML データ型) を使用する必要があります。If you want to obtain the string values that are not entitized, you should use the value() Method (xml Data Type) instead. 次に、 query() メソッドを使用する例を示します。Following is an example of using the query() method:

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

結果を次に示します。This is the result:

This example contains an entitized char: <.  

次に、 value() メソッドを使用する例を示します。Following is an example of using the value() method:

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

結果を次に示します。This is the result:

This example contains an entitized char: <.  

型指定された XML データ型のシリアル化Serializing a Typed xml Data Type

型指定された xml データ型のインスタンスには、XML スキーマ型に従って型指定される値が含まれています。A typed xml data type instance contains values that are typed according to their XML schema types. このような値は、XQuery が xs:string にキャストするのと同じ形式で、XML スキーマ型に従ってシリアル化されます。These values are serialized according to their XML schema type in the same format as the XQuery cast to xs:string produces. 詳細については、「 XQuery での型キャストの規則」を参照してください。For more information, see Type Casting Rules in XQuery.

たとえば、次の例で示すように、xs:double の値 1.34e1 は 13.4 にシリアル化されます。For example, the xs:double value 1.34e1 is serialized to 13.4 as shown in the following example:

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

これは、文字列値 13.4 を返します。This returns the string value 13.4.

参照See Also

XQuery での型キャストの規則 Type Casting Rules in XQuery
CAST と CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)