XDocument防止无效的charachters

我正在使用XDocument来保存一种数据库。 这个数据库由注册的聊天机器人组成,我只是有许多“bot”节点,其中包含“username”,“owner”等属性。 然而,偶尔会有一些聪明的家伙决定制作一个具有非常奇怪特征的机器人作为其中一个属性。 这使得XDocument类系列在读取该节点时抛出exception,这是一个非常大的问题,因为数据库无法完全保存,因为它一旦到达无效字符就停止写入文件。

我的问题是 – 有一个类似XSomething.IsValidString(string s)的简单方法,所以我可以省略有问题的数据吗? 我的数据库不是官方数据库,只是个人使用,因此我不必包含不良数据。

我正在使用的一些代码(变量file是XDocument):
要保存:
file.Save(Path.Combine(Environment.CurrentDirectory, "bots.xml"));

要加载(在检查File.Exists()等之后):
file = XDocument.Load(Path.Combine(Environment.CurrentDirectory, "bots.xml"));

要添加到数据库(变量都是字符串):

  file.Root.Add(new XElement("bot", new XAttribute("username", botusername), new XAttribute("type", type), new XAttribute("botversion", botversion), new XAttribute("bdsversion", bdsversion), new XAttribute("owner", owner), new XAttribute("trigger", trigger))); 

请原谅我缺乏适当的XML技术,我刚刚开始。 我问的是,如果有一个XSomething.IsValidString(string s)方法,而不是我的XML有多糟糕。

好的,我刚刚得到exception,这里是确切的消息和堆栈跟踪。

 System.ArgumentException: '', hexadecimal value 0x07, is an invalid character. at System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize) at System.Xml.XmlUtf8RawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd) at System.Xml.XmlUtf8RawTextWriter.WriteString(String text) at System.Xml.XmlUtf8RawTextWriterIndent.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.XContainer.WriteContentTo(XmlWriter writer) at System.Xml.Linq.XDocument.WriteTo(XmlWriter writer) at System.Xml.Linq.XDocument.Save(String fileName, SaveOptions options) at System.Xml.Linq.XDocument.Save(String fileName) at /* my code stack trace omitted */ 

尝试更改以下代码的file.Save行:

 XmlWriterSettings settings = new XmlWriterSettings(); settings.CheckCharacters = false; XmlWriter writer = XmlWriter.Create(Path.Combine(Environment.CurrentDirectory, "bots.xml"), settings); file.Save(writer); 

来源: http : //sartorialsolutions.wordpress.com/page/2/

首先,您可以检查您的XML文件是否以正确的编码保存? 我通常将xml文件保存为UTF8,您可以在xml标头中声明编码

  

当然,你的xml的主体必须符合xml标准。 这是一篇关于它的好文章

http://weblogs.sqlteam.com/mladenp/archive/2008/10/21/Different-ways-how-to-escape-an-XML-string-in-C.aspx

从.NET 4开始,您可以使用XmlConvert.VerifyXmlChars(string content) 。 如果不接受传递的字符串,这将抛出exception。