私はXDocumentを使用して一種のデータベースを保持しています。このデータベースは登録済みのチャットボットで構成されており、「ユーザー名」や「所有者」などの属性を持つ「ボット」ノードがたくさんあります。ただし、一部の賢い人は、プロパティの1つとして非常に奇妙なキャラクターを持つボットを作成することを決定することがあります。これにより、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 */