2

私は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 */
4

3 に答える 3

3

ファイルを変更してみてください。次のコードの行を保存してください。

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/

于 2012-04-07T18:45:03.993 に答える
0

.NET 4から、を使用できますXmlConvert.VerifyXmlChars(string content)。渡された文字列が受け入れられない場合、これは例外をスローします。

于 2012-05-14T07:51:06.000 に答える
0

まず、XMLファイルが適切なエンコーディングで保存されているかどうかを確認できますか?私は通常xmlファイルをUTF8として保存し、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

于 2012-04-07T18:36:55.017 に答える