Codifica e decodifica dei nomi di elementi e di attributi XML

I nomi di codifica che contengono caratteri non validi nei nomi XML, come gli spazi o i caratteri Katakana a byte singolo, e su cui deve essere eseguito il mapping con nomi XML senza la presenza di schemi, vengono tradotti in nomi XML. I caratteri non validi vengono tradotti in una codifica con sequenza di escape numerica.

All'inizio di un nome XML, sono consentiti solo due caratteri non alfanumerici: i due punti (:) e il carattere di sottolineatura, (_). Poiché i due punti sono già riservati per gli spazi dei nomi, il carattere di sottolineatura verrà utilizzato dalla classe XmlConvert come carattere escape.

Le regole di escape al momento della codifica sono le seguenti:

  • Qualsiasi carattere UCS-2 che non sia un carattere valido per un nome XML, secondo la raccomandazione Extensible Markup Language (XML) 1.0 (Second Edition) viene disposto in sequenza escape come _xHHHH_, dove HHHH rappresenta il codice UCS-2 esadecimale a 4 cifre per il carattere dove il bit più significativo è a sinistra. Il nome Order Details, ad esempio, viene codificato come Order_x0020_Details.
  • Nella codifica del nome XML non sono supportati i surrogati UTF-16. I caratteri delle aggiunte UCS-4 nell'intervallo Unicode compreso tra U+00010000 e U+0010FFFF richiedono invece la codifica a 4 byte completa. Questi caratteri vengono codificati come _xHHHHHHHH*_* dove HHHHHHHH rappresenta la codifica UCS-4 esadecimale a 8 cifre del carattere. Se nel sistema sottostante i caratteri vengono memorizzati come due valori UCS-2, il primo valore UCS-2 x, codice del surrogato alto ovvero la parte più significativa, che rientra nell'intervallo compreso tra U+D800 e U+DBFF e il secondo valore UCS-2 y, codice del surrogato basso ovvero la parte meno significativa, che rientra nell'intervallo compreso tra U+DC00 e U+DFFF, i due valori verranno tradotti nel codice UCS-4 nel modo seguente:
          (x - xD800) * x400 + (y - xDC00) + x10000
    Per esempio , il mapping di U+D800U+DC00 sarà _x00010000_ è U+DBFFU+DFFF a _x0010FFFF_. Se i due valori UCS-2 successivi non formano una codifica UTF-16, vengono codificati in base alla regola 1.
  • Il carattere di sottolineatura non deve essere sottoposto a escape a meno che non sia seguito da una sequenza di caratteri che, insieme al carattere di sottolineatura, possa essere erroneamente interpretata come una sequenza escape quando il nome viene decodificato. Order_Details, ad esempio, non è decodificato ma Order_x0020_ viene codificato come Order_x005f_x0020_.
  • Non è consentito l'utilizzo di forme abbreviate. Ad esempio, _x20*_* o __ non viene generato.

Nella tabella seguente vengono elencati i metodi della classe XmlConvert, insieme alle descrizioni di come ogni metodo esegue la codifica e la decodifica.

Metodo Descrizione
EncodeName Il nome da codificare viene accettato come input e viene restituito il nome codificato. Viene restituito il nome assieme a ogni eventuale carattere non valido sostituito da una stringa di escape. EncodeName consente di utilizzare i due punti in qualsiasi posizione, il che significa che il nome potrebbe ancora essere non valido in base alla raccomandazione XML relativa agli spazi dei nomi nel W3C.
EncodeNmToken Il nome da codificare viene accettato come input e viene restituito il nome codificato.
EncodeLocalName Il nome da codificare viene accettato come input e viene restituito il nome codificato. Questo metodo è uguale a EncodeName eccetto che per il fatto che vengono codificati anche i due punti, garantendone l'utilizzo come parte LocalName di un nome qualificato dello spazio dei nomi.
DecodeName Viene effettuata la trasformazione inversa per tutti i metodi di codifica.

Esempio di codifica

Nell'esempio di codifica seguente, viene illustrato dove la classe XmlConvert modifica i surrogati UTF-16 in codifica UCS-4:

Option Explicit
Option Strict

Imports System
Imports System.Xml
Imports Microsoft.VisualBasic

Class CMain
   Public Shared Sub Main()
      Dim surrogateChar As String = ChrW(&HD800) & ChrW(&HDC00)
      Console.WriteLine("EncodeLocalName: " & _
                        XmlConvert.EncodeLocalName(surrogateChar))
      Console.WriteLine("EncodeName: " & _
                        XmlConvert.EncodeName(surrogateChar))
      Console.WriteLine("EncodeNmToken: " & _
                        XmlConvert.EncodeNmToken(surrogateChar))
   End Sub
End Class
[C#]
using System;
using System.Xml;
 
class CMain
{
    public static void Main(string[] args) 
    {
    string surrogateChar = "\uD800\uDC00"; 
    Console.WriteLine("EncodeLocalName: " +
                      XmlConvert.EncodeLocalName(surrogateChar));
    Console.WriteLine("EncodeName: " +
                       XmlConvert.EncodeName(surrogateChar));
    Console.WriteLine("EncodeNmToken: " +
              XmlConvert.EncodeNmToken(surrogateChar));
    }
}

Output

EncodeLocalName: _x00010000_
EncodeName: _x00010000_
EncodeNmToken: _x00010000_

Vedere anche

Codifica dei caratteri dei nomi XML e conversione dei tipi di dati XML | Conversione dei tipi di dati XML | Membri XmlConvert