我们收集大量字符串并以 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',十六进制值 0x1A,是一个无效字符。System.ArgumentException System.ArgumentException:'',十六进制值 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
并交叉手指?