2011-12-07 40 views
0

次の例外は、クライアントのマシン上で発生していることが報告されました:XElement.SaveがXmlUtf8RawTextWriterが例外をスローするようになり

System.ArgumentException: '', hexadecimal value 0x1F, is an invalid character. 
at System.Xml.XmlUtf8RawTextWriter.InvalidXmlChar(Int32 ch, Byte* pDst, Boolean entitize) 
at System.Xml.XmlUtf8RawTextWriter.WriteElementTextBlock(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.Linq.ElementWriter.WriteElement(XElement e) 
at System.Xml.Linq.XElement.WriteTo(XmlWriter writer) 
at System.Xml.Linq.XElement.Save(XmlWriter writer) 
at System.Xml.Linq.XElement.Save(String fileName, SaveOptions options) 
at System.Xml.Linq.XElement.Save(String fileName) 

残念ながら、これ以上の情報が提供されています。

エラーはちょっと困っています。

0x1Fは疑問です。一部の要素または属性の名前に疑問符が含まれていた場合(これは不正です)、ディスクに保存するときではなく、無効な名前のXElementまたはXAttributeを作成するときに例外がスローされます。

XmlUtf8RawTextWriterクラスで例外がスローされました。内部ではXElementが使用していると思います(アプリケーションではありません)。 XElementは、それ自体でコーディングの問題などを処理することが期待できませんか?何が原因でクラッシュする可能性がありますか?それはいくつかのOSやフレームワークの非互換性ですか?

私の質問はかなり曖昧ですが、私は限られた情報を操作する必要があります。

私は誰かが少なくとも正しい方向に私を指すことができれば感謝します。私は前にこのようなエラーは見ていません。

答えて

2

U + 001Fはではありません。実際には疑問符 - XMLでは許可されていない制御文字(「情報区切り文字1」)です。

XElementに無効な文字がありますが、これは正しく保存できません。どこからデータを取得しているのかは不明ですが、それが問題です。あなたは悪いデータで何をすべきかを考えなければなりません。それを完全に削除するかどうかは何とかしています。先端のための

using System; 
using System.IO; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     var element = new XElement("foo", "\u001f"); 
     element.Save(new MemoryStream()); 
    } 
} 
+0

感謝を:

はここで、それは場合に役立ちます、しかし、問題を再現します短いが完全なプログラムです。しかし、 'XElement'はエスケープする必要がある文字(アンパサンドなど)を自動的にエスケープしたり、CDATAブロックにラップしたりしませんか? 'XElement'の内容を"手動で "どのようにして浄化しますか? –

+0

@Morawski:いいえ - あなたは単純にCDATAではなく、XMLで直接それらの文字を表現することはできません。サニタイズするには、コンテンツに無効な文字が含まれているかどうかをチェックし、そうであれば置換するメソッドを記述したいと思うでしょう。 (正規表現を置き換える*が*最速のアプローチになる可能性があります)XElementに入る前に、私があなただったとしてもそれをやり遂げます。 –

関連する問題