Wir sammeln viele Zeichenfolgen und senden sie an unsere Kunden in XML-Fragmenten. Diese Zeichenfolgen können buchstäblich jedes Zeichen enthalten. Beim Versuch, XElement-Instanzen mit "schlechten" Zeichen zu serialisieren, ist ein Fehler aufgetreten. Hier ein Beispiel:Behandeln von Zeichenfolgen zum Einfügen 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
Der obige Code generiert eine Ausnahme an der angegebenen Zeile. Hier ist der 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)
Mein Verdacht ist, dass dies nicht das richtige Verhalten und die schlechten Zeichen sollten in die XML entwertet werden. Ob dies wünschenswert ist oder nicht, ist eine Frage, die ich später beantworten werde.
Also hier ist die Frage:
Gibt es eine Möglichkeit Strings behandeln, so dass dieser Fehler auftreten kann, nicht, oder sollte ich einfach alle Zeichen Streifen unter char 0x20
und meine Finger kreuzen?
Gute Frage. Eigentlich sollten Sie * alle * Zeichen unterhalb von 0x20 nicht entfernen, da einige von ihnen ordnungsgemäß maskiert sind (z. B. CR, LF, TAB ...). Aber ich kann keinen Grund sehen, warum die anderen nicht entkommen können ... –
Werden Ihre Kunden jemals diese Zeichen in den Strings brauchen? – climbage
Nein. Definitiv nicht. Sie werden entweder in einem WPF-Textfeld oder als mvcstring in einer Webanwendung gerendert. In unserem Fall könnten sogar @ThomasLevesques cr/lf/tab-Combos entfernt werden, weil wir eine einzelne Zeile erwarten. Diese Strings sind eine echte Reise zu unseren Servern über IDV3-Tags, Broadcasting-Software und Shoutcast-Server. Es ist gut möglich, dass Codierungen auf dem Weg herumgemistet wurden. Ich denke, dass meine Lösung für uns völlig anwendbar ist. Ich bin immer noch verwirrt von dieser Ausnahme und möchte bestätigen, dass ich einen Fehler in .net entdeckt habe. – spender