Raccogliamo un sacco di stringhe e le inviamo ai nostri clienti in frammenti xml. Queste stringhe potrebbero contenere letteralmente qualsiasi carattere. È stato rilevato un errore causato dal tentativo di serializzare istanze XElement contenenti caratteri "non validi". Ecco un esempio:Trattare stringhe per l'inserimento in XElement
var message = new XElement("song");
char c = (char)0x1a; //sub
var someData = string.Format("some{0}stuff", c);
var attr = new XAttribute("someAttr", someData);
message.Add(attr);
string msgStr = message.ToString(SaveOptions.DisableFormatting); //exception here
Il codice sopra genera un'eccezione nella riga indicata. Ecco lo stacktrace:
'SUB', hexadecimal value 0x1A, is an invalid character. System.ArgumentException System.ArgumentException: '', hexadecimal value 0x1A, is an invalid character. at System.Xml.XmlEncodedRawTextWriter.InvalidXmlChar(Int32 ch, Char* pDst, Boolean entitize) at System.Xml.XmlEncodedRawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd) at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) at System.Xml.XmlWellFormedWriter.WriteString(String text) at System.Xml.XmlWriter.WriteAttributeString(String prefix, String localName, String ns, String value) at System.Xml.Linq.ElementWriter.WriteStartElement(XElement e) at System.Xml.Linq.ElementWriter.WriteElement(XElement e) at System.Xml.Linq.XElement.WriteTo(XmlWriter writer) at System.Xml.Linq.XNode.GetXmlString(SaveOptions o)
Il mio sospetto è che questo non è il comportamento corretto e il cattivo carattere deve essere sfuggito in XML. Se questo sia desiderabile o meno è una domanda che risponderò più tardi. ci
è in qualche modo di trattare le stringhe in modo tale che questo errore potrebbe non verificarsi, o dovrei semplicemente a nudo tutti i caratteri di sotto char 0x20
e incrocio le dita:
Quindi, ecco la domanda?
Buona domanda. In realtà non dovresti eliminare * tutti * i caratteri sotto 0x20, perché alcuni di essi sono debitamente escape (ad esempio CR, LF, TAB ...). Ma non riesco a vedere alcun motivo per cui gli altri non siano sfuggiti ... –
I tuoi clienti avranno davvero bisogno di quei personaggi nelle corde? – climbage
No. Assolutamente no. Sono resi in una casella di testo WPF o come mvcstring in una webapp. Infatti, nel nostro caso, anche le combo cr/lf/tab di @ThomasLevesque potrebbero essere eliminate perché ci aspettiamo una singola riga. Queste stringhe fanno un bel viaggio ai nostri server tramite tag idv3, software di trasmissione e server shoutcast. È possibile che le codifiche siano state violate lungo il percorso. Penso che la mia correzione sia interamente applicabile per noi. Sono ancora confuso da questa eccezione, e vorrei la conferma che sembra di aver individuato un bug in .net. – spender