的XDocument防止无效字符(XDocument prevent invalid charact

2019-09-16 10:05发布

我使用的XDocument保持一个形式的数据库。 该数据库由注册chatterbots的,我只是有很多“僵尸”与属性,比如“用户名”,“老板”,而这样的节点。 然而,偶尔有些聪明的家伙决定让一个机器人有一个奇怪的字符作为属性之一。 这使得因为数据库不能完全保存,因为它停止,因为它击中无效字符尽快写入文件中的XDocument类系列抛出一个异常,每当节点被读取时,一个非常大的问题。

我的问题是这-有这就是说,一个简单的方法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不是多么可怕。

好吧,我刚刚得到了异常再次,这里是确切的消息和堆栈跟踪。

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 */

Answer 1:

尝试改变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/



Answer 2:

首先,你可以检查你的XML文件是否保存有正确的编码? 我通常的XML文件保存为UTF-8,你可以在你的XML头编码声明

<?xml version="1.0" encoding="UTF-8"?>

当然,你的XML的身体必须符合XML标准。 下面是关于它的好文章

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



Answer 3:

从.NET 4,你可以使用XmlConvert.VerifyXmlChars(string content) 。 如果传递的字符串,则不接受该会抛出异常。



文章来源: XDocument prevent invalid characters