Definir a serialização de dados XML

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureBanco de Dados SQL no Microsoft Fabric

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 para serialização

Se o tipo de destino SQL for VARBINARY, o resultado será serializado em UTF-16 com uma marca de ordem de bytes UTF-16 no início, mas sem a 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 byte no início e sem 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 do SQL for VARCHAR ou CHAR, o resultado será serializado na codificação correspondente à página de código da ordenação do banco de dados, sem uma marca de ordem de bytes nem 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 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, os nós de elementos são mapeados para a marcação do elemento, e os nós de texto são mapeados para o 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.

Conversão de caracteres XML em entidades durante a serialização

Cada estrutura XML serializada deve poder ser reanalisada. Portanto, alguns caracteres precisam ser serializados na forma de entidades para preservar a capacidade de ida e volta dos caracteres ao passarem pela fase de normalização do analisador XML. No entanto, alguns caracteres precisam ser representados como entidades para que o documento seja bem-formado e, portanto, possa ser processado. 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;.

  • Um par substituto é convertido em uma única referência numérica de caractere, somente ao fazer a conversão no servidor. Por exemplo, o par substituto U+D800 U+DF00 é convertido na referência numérica de caractere &#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 forma, o reprocessamento preserva o nó de texto de espaço em branco, independentemente da configuração de tratamento de espaço em branco durante o processamento.

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 tipado

Uma instância do tipo de dados xml tipada contém valores tipados de acordo com os respectivos tipos do esquema XML. Esses valores são serializados de acordo com seu tipo no esquema XML, no mesmo formato produzido pela conversão de XQuery para 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.