Definir la serialización de datos XMLDefine the Serialization of XML Data

SE APLICA A: síSQL Server noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Cuando el tipo de datos xml se convierte de manera explícita o implícita a un tipo SQL binario o de cadena, el contenido del tipo de datos xml se serializa de acuerdo con las reglas que se describen en este tema.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.

Codificación de la serializaciónSerialization Encoding

Si el tipo SQL de destino es VARBINARY, el resultado se serializa en UTF-16 con una marca de orden de bytes UTF-16 delante, pero sin una declaración XML.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. Si el tipo de destino es demasiado pequeño, se genera un error.If the target type is too small, an error is raised.

Por ejemplo:For example:

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

El resultado es el siguiente:This is the result:

0xFFFE3C0094032F003E00  

Si el tipo SQL de destino es NVARCHAR o NCHAR, el resultado se serializa en UTF-16 sin una marca de orden de bytes y sin una declaración XML.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. Si el tipo de destino es demasiado pequeño, se genera un error.If the target type is too small, an error is raised.

Por ejemplo:For example:

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

El resultado es el siguiente:This is the result:

<Δ/>  

Si el tipo SQL de destino es VARCHAR o NCHAR, el resultado se serializa en la codificación que corresponda a la página de códigos de intercalación de la base de datos, sin marca de orden de bytes ni declaración 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. Si el tipo de destino es demasiado pequeño o el valor no se puede asignar a la página de códigos de intercalación de destino, se genera un error.If the target type is too small or the value cannot be mapped to the target collation code page, an error is raised.

Por ejemplo:For example:

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

Se puede generar un error si la página de códigos de la intercalación actual no puede representar el carácter Unicode Δ, o se representará en la codificación específica.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.

Cuando se devuelven los resultados XML al cliente, los datos se envían codificados como UTF-16.When returning XML results to the client side, the data will be sent in UTF-16 encoding. Después, el proveedor del lado cliente expondrá los datos de acuerdo con sus reglas de API.The client-side provider will then expose the data according to its API rules.

Serialización de las estructuras XMLSerialization of the XML Structures

El contenido de un tipo de datos xml se serializa de la forma habitual.The content of an xml data type is serialized in the usual way. Concretamente, los nodos de elementos se asignan a marcado de elemento y los nodos de texto se asignan a contenido de texto.Specifically, element nodes are mapped to element markup, and text nodes are mapped to text content. No obstante, en las siguientes secciones se describen las circunstancias en las que se crean entidades para los caracteres y cómo se serializan los valores atómicos con tipo.However, the circumstances under which characters are entitized and how typed atomic values are serialized are described in the following sections.

Creación de entidades para caracteres XML durante la serializaciónEntitization of XML Characters During Serialization

Todas las estructuras XML serializadas deberían poder analizarse de nuevo.Every serialized XML structure should be capable of being reparsed. Por tanto, algunos caracteres deben serializarse como entidades para que conserven su funcionalidad de ida y vuelta durante la fase de normalización del analizador 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 . Sin embargo, deben crearse entidades para algunos caracteres con el fin de que el formato del documento sea correcto, y, por tanto, se pueda analizar.However, some characters have to be entitized so that the document is well-formed and, therefore, able to be parsed. A continuación se exponen las reglas de creación de entidades que se aplican durante la serialización:Following are the entitization rules that apply during serialization:

  • Para los caracteres &, < y > siempre se crean las entidades &, < y >, respectivamente, si aparecen en valores de atributos o en el contenido de elementos.The characters &, <, and > are always entitized to &, <, and > respectively, if they occur inside an attribute value or element content.

  • Dado que SQL Server usa comillas (U+0022) para incluir los valores de los atributos, para las comillas de los valores de atributo se crea la entidad ".Because SQL Server uses a quotation mark (U+0022) for enclosing attribute values, the quotation mark in attribute values is entitized as ".

  • La entidad que se crea para un par suplente es una única referencia de carácter numérico, solo cuando la conversión se realiza en el servidor.A surrogate pair is entitized as a single numeric character reference, when casting on the server only. Por ejemplo, el par suplente U+D800 U+DF00 pasa a ser la entidad de referencia de carácter numérico &#x00010300;.For example the surrogate pair U+D800 U+DF00 is entitized to the numeric character reference &#x00010300;.

  • Para evitar que un carácter de tabulación (U+0009) o avance de línea (LF, U+000A) se normalice durante el análisis, tendrán como entidades sus referencias de carácter numérico (&#x9; y &#xA;, respectivamente) en los valores de atributos.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.

  • Para evitar que un carácter de retorno de carro (CR, U+000D) se normalice durante el análisis, tendrá como entidad su referencia de carácter numérico (&#xD;) en los valores de atributos y en el contenido de elementos.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.

  • Para proteger los nodos de texto que solo contienen espacios en blanco, se crea una entidad para uno de los caracteres de espacio en blanco, generalmente el último, que se corresponde con su referencia de carácter numérico.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. De esta manera, cuando se vuelve a realizar el análisis, se conserva el nodo de texto de espacio en blanco independientemente de la configuración del control de espacios en blanco durante el análisis.In this way, reparsing preserves the white-space text node, regardless of the setting of the white-space handling during parsing.

Por ejemplo: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))  

El resultado es el siguiente:This is the result:

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

Si no quiere aplicar la regla de protección del último espacio en blanco, puede usar la opción explícita de CONVERT 1 al convertir el tipo xml en un tipo de cadena o binario.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. Por ejemplo, para evitar la creación de entidades, tiene las opciones siguientes:For example, to avoid entitization, you can do the following:

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

Tenga en cuenta que query() (método de tipo de datos xml) genera una instancia de tipo de datos xml.Note that, the query() Method (xml Data Type) results in an xml data type instance. Por tanto, se crearán entidades para cualquier resultado del método query() que se convierta en un tipo binario o de cadena de acuerdo con las reglas previamente descritas.Therefore, any result of the query() method that is cast to a string or binary type is entitized according to the previously described rules. Si se quieren obtener los valores de cadena sin creación de entidades, en su lugar debe usarse value() (método del tipo de datos xml) .If you want to obtain the string values that are not entitized, you should use the value() Method (xml Data Type) instead. A continuación se ofrece un ejemplo de uso del método 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()')  

El resultado es el siguiente:This is the result:

This example contains an entitized char: <.  

A continuación se ofrece un ejemplo de uso del método value() :Following is an example of using the value() method:

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

El resultado es el siguiente:This is the result:

This example contains an entitized char: <.  

Serializar un tipo de datos xml con tipoSerializing a Typed xml Data Type

Una instancia de tipo de datos xml con tipo contiene valores cuyos tipos se corresponden con los tipos de su esquema XML.A typed xml data type instance contains values that are typed according to their XML schema types. Estos valores se serializan según su tipo de esquema XML, en el mismo formato que genera la conversión XQuery a xs:string.These values are serialized according to their XML schema type in the same format as the XQuery cast to xs:string produces. Para obtener más información, vea Reglas de conversión de tipos en XQuery.For more information, see Type Casting Rules in XQuery.

Por ejemplo, el valor 1.34e1 de tipo xs:double se serializa como 13.4, como se observa en el ejemplo siguiente: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))  

Se obtiene el valor de cadena 13.4.This returns the string value 13.4.

Consulte tambiénSee Also

Reglas de conversión de tipos en XQuery Type Casting Rules in XQuery
CAST y CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)