Definir a serialização de dados XML

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Ao converter o tipo de dados xml, explícita ou implicitamente, em uma cadeia de caracteres SQL ou em um tipo binário, o conteúdo do tipo de dados xml será serializado de acordo com as regras descritas neste artigo.

Codificação de serialização

Se o tipo de destino SQL for VARBINARY, o resultado será serializado em UTF-16 com uma marca de ordem de 16 bytes UTF na frente, mas sem uma declaração XML. Se o tipo de destino for muito pequeno, será retornado um erro.

Por exemplo:

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

Este é o resultado:

0xFFFE3C0094032F003E00

Se o tipo de destino SQL for NVARCHAR ou NCHAR, o resultado será serializado em UTF-16 sem a marca de ordem de bytes na frente e sem uma declaração XML. Se o tipo de destino for muito pequeno, será retornado um erro.

Por exemplo:

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

Este é o resultado:

<Δ/>

Se o tipo de destino SQL for VARCHAR ou CHAR, o resultado será serializado na codificação correspondente à página de código de ordenação do banco de dados sem uma marca de ordem de byte ou uma declaração XML. Um erro será gerado se o tipo de destino for muito pequeno ou o valor não puder ser mapeado para a página de código da ordenação de destino.

Por exemplo:

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

Isso pode resultar em um erro se a página de código da ordenação atual não puder representar o caractere Unicode Δ ou se ela o representar na codificação específica.

Ao retornar resultados XML para o lado do cliente, os dados serão enviados em codificação UTF-16. O provedor do lado do cliente exporá os dados de acordo com as regras de sua API.

Serialização das estruturas XML

O conteúdo de um tipo de dados xml é serializado da maneira normal. Especificamente, nós de elemento são mapeados para marcação de elemento e nós de texto são mapeados para conteúdo de texto. No entanto, as circunstâncias nas quais a entidade dos caracteres é definida e a maneira como valores atômicos digitados são serializados são descritas nas seções a seguir.

Definição da entidade de caracteres XML durante a serialização

Cada estrutura XML serializada deve poder ser reanalisada. Portanto alguns caracteres precisam ser serializados de uma maneira de definição de entidade para preservar a capacidade de viagem de ida e volta dos caracteres durante a fase de normalização do analisador XML. No entanto a entidade de alguns caracteres precisa ser definida para que o documento seja bem formado e portanto possa ser analisado. As regras de definição de entidade aplicáveis durante a serialização são as seguintes:

  • Os caracteres &, < e > sempre têm a entidade definida como &amp;, &lt; e &gt;, respectivamente, quando ocorrem dentro de um valor de atributo ou conteúdo de elemento.

  • Como o SQL Server usa aspas (U+0022) para incluir valores de atributos, a entidade de aspas em valores de atributos é definida como &quot;.

  • A entidade de um par substituto é definida como uma referência de caractere numérico único na conversão no servidor apenas. Por exemplo, a entidade do par alternativo U+D800 U+DF00 é definida como a referência de caractere numérico &#x00010300;.

  • Para impedir que um TAB (U+0009) e uma alimentação de linha (LF, U+000A) sejam normalizados durante a análise, eles têm suas entidades definidas como referências de caracteres numéricos &#x9; e &#xA;, respectivamente, dentro de valores de atributos.

  • Para evitar que um retorno de carro (CR, U+000D) seja normalizado durante a análise, ele tem sua entidade definida para sua referência de caractere numérico, &#xD; dentro dos valores de atributo e do conteúdo do elemento.

  • Para proteger nós de texto que contêm apenas espaço em branco, a entidade de um dos caracteres de espaço em branco, geralmente o último, é definida como sua referência de caractere numérico. Dessa maneira, a reanálise preserva o nó de texto do caractere em branco, independentemente da configuração do tratamento do espaço em branco durante a análise.

Por exemplo:

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

Este é o resultado:

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

Se não quiser aplicar a última regra de proteção de espaço em branco, você poderá usar a opção CONVERT explícita 1 ao converter de xml para um tipo de cadeia de caracteres ou binário. Por exemplo, para evitar a definição de entidade, você pode fazer o seguinte:

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

O método query() (tipo de dados xml) resulta em uma instância de tipo de dados xml. Portanto, qualquer resultado do método query() que seja convertido em uma cadeia de caracteres ou tipo binário tem sua entidade definida de acordo com as regras descritas anteriormente. Se você quiser obter os valores de cadeia de caracteres sem entidades definidas, deverá usar o método value() (tipo de dados xml). Veja a seguir um exemplo de uso do método query():

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

Este é o resultado:

This example contains an entitized char: .

Veja a seguir um exemplo de uso do método value():

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

Este é o resultado:

This example contains an entitized char: .

Serializando um tipo de dados xml com tipo

Uma instância de tipo de dados xml com tipo contém valores com tipo de acordo com seus tipos de esquema XML. Esses valores são serializados de acordo com seu tipo de esquema XML no mesmo formato que a conversão de Xquery para procedimentos xs:string. Para obter mais informações, veja Regras de conversão de tipo em XQuery.

Por exemplo, o valor de xs:double 1.34e1 é serializado como 13.4 conforme mostrado no exemplo a seguir:

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

Isso retorna o valor da cadeia de caracteres 13.4.

Confira também