多くの文字列を収集し、xml フラグメントでクライアントに送信します。これらの文字列には、文字通り任意の文字を含めることができます。「不適切な」文字を含む 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
上記のコードは、示された行で例外を生成します。スタックトレースは次のとおりです。
「SUB」、16 進値 0x1A は無効な文字です。System.ArgumentException System.ArgumentException: ''、16 進値 0x1A は無効な文字です。 System.Xml.XmlEncodedRawTextWriter.InvalidXmlChar で (Int32 ch、Char * pDst、ブール値のエンティティ化) System.Xml.XmlEncodedRawTextWriter.WriteAttributeTextBlock で (Char * pSrc、Char * pSrcEnd) System.Xml.XmlEncodedRawTextWriter.WriteString (文字列テキスト) で System.Xml.XmlWellFormedWriter.WriteString (文字列テキスト) で System.Xml.XmlWriter.WriteAttributeString (文字列プレフィックス、文字列 localName、文字列 ns、文字列値) で System.Xml.Linq.ElementWriter.WriteStartElement (XElement e) で System.Xml.Linq.ElementWriter.WriteElement (XElement e) で System.Xml.Linq.XElement.WriteTo (XmlWriter ライター) で System.Xml.Linq.XNode.GetXmlString (SaveOptions o) で
私の疑いでは、これは正しい動作ではなく、不正な文字は XML にエスケープする必要があります。これが望ましいかどうかは、後で答える質問です。
だからここに質問があります:
このエラーが発生しないように文字列を処理する方法はありますか、それとも char の下のすべての文字を単純に削除し0x20
て指を交差させる必要がありますか?