Caratteri non validi e regole di escapeInvalid Characters and Escape Rules

Questo argomento descrive il modo in cui i caratteri XML non validi vengono gestiti dalla clausola FOR XML ed elenca le regole di escape per i caratteri non validi nei nomi XML.This topic describes how invalid XML characters are handled by the FOR XML clause, and lists the escape rules for characters that are invalid in XML names.

Per i caratteri XML non validiFor XML and Invalid Characters

SQL ServerSQL Server sostituisce caratteri XML non validi con entità quando vengono restituiti all'interno di query FOR XML che non usano la direttiva TYPE. entitizes invalid XML characters when they are returned within FOR XML queries that do not use the TYPE directive.

Nei parser conformi a XML 1.0 vengono generati errori di analisi indipendentemente dal fatto che tali caratteri vengano sostituiti o meno con entità, tuttavia la forma con entità è maggiormente conforme a XML 1.1Although XML 1.0 conformant parsers raise parse errors regardless of whether these characters are entitized or not, the entitized form is better aligned with XML 1.1. ed è potenzialmente conforme alle versioni future dello standard XML.The entitized form is also potentially better aligned with future versions of the XML standard. Semplifica inoltre il debug perché il punto di codice del carattere non valido diventa visibile.Additionally, it makes debugging simpler, because the code point of the invalid character becomes visible.

Per gli utenti degli strumenti XML non è necessaria alcuna soluzione alternativa, perché il parser XML genererà in ogni caso un errore in corrispondenza dei caratteri non validi nel flusso di dati.For users of XML tools, no workaround is required, because the XML parser will fail either way at the point where the invalid characters occur in the data stream. Se si utilizzano strumenti non XML potrebbe essere necessario aggiornare la logica di programmazione in modo che sia in grado di cercare i caratteri come valori sostituiti con entità.If you use non-XML tools, this change can require you to update your programming logic to search for these characters as entitized values.

I caratteri spazi vuoti indicati di seguito vengono sostituiti da entità diverse nelle query FOR XML per mantenerne la presenza in sequenze di andata e ritorno:The following white space characters are entitized differently in FOR XML queries to preserve their presence through round-tripping:

  • Nel contenuto e negli attributi di un elemento: hex(0D) (ritorno a capo)In element content and attributes: hex(0D) (carriage return)

  • Nel contenuto di un attributo: hex(09) (tabulazione), hex(0A) (avanzamento di riga)In attribute content: hex(09) (tab), hex(0A) (line feed)

    Questi caratteri vengono mantenuti nell'output e non verranno normalizzati da un parser.These characters are preserved in output, and a parser will not normalize them.

Regole di escapeEscape Rules

SQL ServerSQL Server nomi che includono caratteri non validi per i nomi XML, quali gli spazi, vengono convertiti in nomi XML in modo tale che i caratteri non validi vengano convertiti in codici numerici in sequenza escape. names that contain characters that are invalid in XML names, such as spaces, are translated into XML names in a way in which the invalid characters are translated into escaped numeric entity encoding.

In un nome XML possono essere presenti solo due caratteri non alfabetici, ovvero i due punti (:) e il carattere di sottolineatura ().There are only two non-alphabetic characters that can occur within an XML name: the colon (:) and the underscore (). Poiché il carattere di due punti è già riservato per gli spazi dei nomi, come carattere di escape viene utilizzato il carattere di sottolineatura.Because the colon is already reserved for namespaces, the underscore is chosen as the escape character. Di seguito vengono illustrate le regole di escape utilizzate per la codifica:Following are the escape rules that are used for encoding:

  • Per i caratteri UCS-2 non validi per i nomi XML, in base alla specifica XML 1.0, vengono usati i caratteri di escape xHHHH\.Any UCS-2 character that is not a valid XML name character, according to the XML 1.0 specification, is escaped as xHHHH\. dove HHHH rappresenta il codice UCS-2 esadecimale a quattro cifre per il carattere in base all'ordine del primo bit più significativo.The HHHH stands for the four-digit hexadecimal UCS-2 code for the character in the most significant bit-first order. Ad esempio, il nome della tabella Order Details viene convertito in Order_x0020_Details.For example, the table name Order Details is encoded as Order_x0020_Details.

  • I caratteri che non rientrano nelle specifiche UCS-2 (le aggiunte UCS-4 dell'intervallo da U+00010000 a U+0010FFFF) vengono convertiti in xHHHHHHHH,_.Characters that do not fit into the UCS-2 realm (the UCS-4 additions of the range U+00010000 to U+0010FFFF) are encoded as xHHHHHHHH\. dove HHHHHHHH rappresenta la codifica UCS-4 esadecimale a otto cifre del carattere, se è attiva la compatibilità con le versioni precedenti con SQL Server 2000.The HHHHHHHH stands for the eight-digit hexadecimal UCS-4 encoding of the character, if under SQL Server 2000 backward compatibility mode. In caso contrario, i caratteri vengono convertiti in xHHHHHH_per la compatibilità con lo standard ISO.Otherwise, the characters are encoded as_xHHHHHH\, in order to align with the ISO standard.

  • Per il carattere di sottolineatura è necessario utilizzare caratteri di escape solo se è seguito dal carattere x.The underscore character does not have to be escaped unless it is followed by the character x. Ad esempio, il nome della tabella Order_Details non viene codificato.For example, the table name Order_Details is not encoded.

  • Per il carattere dei due punti negli identificatori non vengono utilizzati caratteri di escape, in modo tale che l'elemento dello spazio dei nomi e i nomi degli attributi possano essere generati dalla query FOR XML.The colon in identifiers is not escaped As a result, the namespace element and attribute names can be generated by the FOR XML query. Ad esempio, la query seguente genera un attributo dello spazio dei nomi che include i due punti nel nome.For example, the following query generates a namespace attribute that has a colon in the name:

    SELECT 'namespace-urn' as 'xmlns:namespace',   
     1 as 'namespace:a'   
    FOR XML RAW  
    

    Il risultato della query è il seguente:The query produces this result:

    <row xmlns:namespace="namespace-urn" namespace:a="1"/>  
    

    Si noti che per aggiungere spazi dei nomi XML è consigliabile utilizzare WITH XMLNAMESPACES.Note that WITH XMLNAMESPACES is the recommended way to add XML namespaces.

Vedere ancheSee Also

FOR XML (SQL Server)FOR XML (SQL Server)