Definire la serializzazione di dati XMLDefine the Serialization of XML Data

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)noDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse Quando si esegue il cast esplicito o implicito del tipo di dati xml a un tipo SQL stringa o binario, il contenuto del tipo di dati xml viene serializzato in base alle regole illustrate in questo argomento. 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.

Codifica della serializzazioneSerialization Encoding

Se il tipo SQL di destinazione è VARBINARY, il risultato viene serializzato nel formato UTF-16 preceduto da un indicatore dell'ordine dei byte UTF-16, ma senza una dichiarazione 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. Se il tipo di destinazione è di grandezza troppo ridotta, viene generato un errore.If the target type is too small, an error is raised.

Esempio:For example:

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

Risultato:This is the result:

0xFFFE3C0094032F003E00  

Se il tipo SQL di destinazione è NVARCHAR o NCHAR, il risultato viene serializzato nel formato UTF-16 non preceduto dall'indicatore dell'ordine dei byte e senza una dichiarazione 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. Se il tipo di destinazione è di grandezza troppo ridotta, viene generato un errore.If the target type is too small, an error is raised.

Esempio:For example:

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

Risultato:This is the result:

<Δ/>  

Se il tipo SQL di destinazione è VARCHAR o NCHAR, il risultato viene serializzato nella codifica corrispondente alla tabella codici delle regole di confronto del database, senza un indicatore dell'ordine dei byte o una dichiarazione 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. Se il tipo di destinazione è di grandezza troppo ridotta o se non è possibile eseguire il mapping del valore alla tabella codici delle regole di confronto di destinazione, viene generato un errore.If the target type is too small or the value cannot be mapped to the target collation code page, an error is raised.

Esempio:For example:

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

In questo caso è possibile che venga generato un errore se la tabella codici delle regole di confronto corrente non è in grado di rappresentare il carattere Unicode Δ, oppure tale carattere verrà rappresentato nella codifica specifica.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.

Per la restituzione dei risultati XML al lato client, i dati verranno inviati con la codifica UTF-16.When returning XML results to the client side, the data will be sent in UTF-16 encoding. Il provider sul lato client esporrà quindi i dati in base alle regole delle relative API.The client-side provider will then expose the data according to its API rules.

Serializzazione delle strutture XMLSerialization of the XML Structures

Il contenuto di un tipo di dati xml viene serializzato nel modo standard.The content of an xml data type is serialized in the usual way. In particolare, viene eseguito il mapping dei nodi elemento al markup dell'elemento e il mapping dei nodi di testo al contenuto testuale.Specifically, element nodes are mapped to element markup, and text nodes are mapped to text content. Nelle sezioni seguenti vengono tuttavia illustrate le situazioni in cui i caratteri vengono sostituiti con entità e le modalità di serializzazione dei valori atomici tipizzati.However, the circumstances under which characters are entitized and how typed atomic values are serialized are described in the following sections.

Sostituzione dei caratteri XML con entità durante la serializzazioneEntitization of XML Characters During Serialization

È consigliabile analizzare tutte le strutture XML serializzate.Every serialized XML structure should be capable of being reparsed. La serializzazione di alcuni caratteri deve pertanto prevedere la sostituzione con entità, in modo tale da mantenere per i caratteri la possibilità di eseguire il round trip durante la fase di normalizzazione del parser 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 . La sostituzione di alcuni caratteri con entità deve tuttavia garantire che il documento sia ben formato e possa pertanto essere analizzato.However, some characters have to be entitized so that the document is well-formed and, therefore, able to be parsed. Di seguito sono illustrate le regole della sostituzione con entità applicabili alla serializzazione:Following are the entitization rules that apply during serialization:

  • I caratteri &, < e > vengono sempre sostituiti rispettivamente con le entità &, < e > se sono presenti in un valore di attributo o nel contenuto di un elemento.The characters &, <, and > are always entitized to &, <, and > respectively, if they occur inside an attribute value or element content.

  • SQL Server racchiude i valori di attributo tra virgolette singole (U+0022) e pertanto la virgoletta nei valori di attributo viene sostituita con l'entità ".Because SQL Server uses a quotation mark (U+0022) for enclosing attribute values, the quotation mark in attribute values is entitized as ".

  • Una coppia di surrogati viene sostituita dall'entità rappresentata da un riferimento a un singolo carattere numerico, se il cast viene eseguito solo nel server.A surrogate pair is entitized as a single numeric character reference, when casting on the server only. Ad esempio, la coppia di surrogati U+D800 U+DF00 viene sostituita dall'entità rappresentata dal riferimento al carattere numerico &#x00010300;.For example the surrogate pair U+D800 U+DF00 is entitized to the numeric character reference &#x00010300;.

  • Per evitare che una tabulazione TAB (U+0009) e un avanzamento di riga (LF, U+000A) vengano normalizzati durante l'analisi, vengono sostituiti con le entità rappresentate dai relativi riferimenti a caratteri numerici, rispettivamente &#x9; e &#xA;, all'interno dei valori di attributo.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.

  • Per evitare che un ritorno a capo (CR, U+000D) venga normalizzato durante l'analisi, viene sostituito con l'entità rappresentata dal relativo riferimento a un carattere numerico, &#xD; all'interno dei valori di attributo e nel contenuto dell'elemento.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.

  • Per proteggere i nodi di testo che contengono solo spazi vuoti, uno degli spazi vuoti (in genere l'ultimo) viene sostituito con l'entità rappresentata dal relativo riferimento a un carattere numerico.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 questo modo, durante l'analisi il nodo di testo con spazi vuoti viene mantenuto, indipendentemente da come vengono gestiti gli spazi vuoti durante l'analisi.In this way, reparsing preserves the white-space text node, regardless of the setting of the white-space handling during parsing.

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

Risultato:This is the result:

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

Se non si vuole applicare l'ultima regola relativa agli spazi vuoti, è possibile usare l'opzione esplicita CONVERT 1 quando si esegue il cast dal tipo xml a un tipo string o binary.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. Ad esempio, per evitare la sostituzione con entità, è possibile specificare quanto segue:For example, to avoid entitization, you can do the following:

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

Si noti che il metodo query() (tipo di dati xml) restituisce un'istanza del tipo di dati xml.Note that, the query() Method (xml Data Type) results in an xml data type instance. Qualsiasi risultato del metodo query() per cui viene eseguito il cast a un tipo string o binary viene pertanto sostituito con entità in base alle regole descritte in precedenza.Therefore, any result of the query() method that is cast to a string or binary type is entitized according to the previously described rules. Per evitare che i valori stringa ottenuti vengano sostituiti con entità, è consigliabile usare invece il metodo value() (tipo di dati xml) .If you want to obtain the string values that are not entitized, you should use the value() Method (xml Data Type) instead. Di seguito è riportato un esempio d'uso del metodo 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()')  

Risultato:This is the result:

This example contains an entitized char: <.  

Di seguito è riportato un esempio d'uso del metodo value() :Following is an example of using the value() method:

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

Risultato:This is the result:

This example contains an entitized char: <.  

Serializzazione di un tipo di dati xml tipizzatoSerializing a Typed xml Data Type

Un'istanza di un tipo di dati xml tipizzato contiene valori tipizzati in base ai relativi tipi XML Schema.A typed xml data type instance contains values that are typed according to their XML schema types. Tali valori vengono serializzati in base al tipo XML Schema nel stesso formato generato dal cast di 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. Per altre informazioni, vedere Regole del cast dei tipi in XQuery.For more information, see Type Casting Rules in XQuery.

Ad esempio, il valore xs:double 1.34e1 viene serializzato in 13.4, come illustrato nell'esempio seguente: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))  

Viene restituito il valore stringa 13.4.This returns the string value 13.4.

Vedere ancheSee Also

Regole del cast dei tipi in XQuery Type Casting Rules in XQuery
CAST e CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)