2011-01-05 12 views
1

ちょっと、私はXMLを使ってデータを保存するアプリケーションを持っています。私は最近、自分のデータファイルを開くことができないユーザーからバグ報告を受け取りました。パーサーは、悪いキャラクターに遭遇したときに明らかに失敗しました。XMLファイルの奇妙な文字(ユーザ入力から)

幸いにも、私は彼女のデータファイルのコピーを持っているので、私は原因を見つけることができましたが、それは何か、またはそれがどのようになったのか分かりません。問題のある文字がある(これは、ユーザーからのすべてのキーボード入力されるように。):

attributeName="Some text then XXX" 

「XXX」は六角エディタによれば、ある場合:

0A 0A 00 

0Aは改行であります私が言うことができる限り、しかし、どのように地獄のヌル文字の終わりになるだろうか?これは私がこの性質を見た最初のバグです。

+0

ユーザーがコピー&ペーストた場合、これは実際にNULL文字簡単に発生する可能性があるようです(たぶん、ユーザーがウェブサイトまたはWord文書からそれを得ましたか)。 –

+0

これは珍しいことではありません(私は!)、私はそのようなデータをデータベースで見たことがあります。 UIは制御文字をチェックせず、データがxmlとしてシリアライズされたときにのみ問題が発見され、受信側でxml 1.0のコンテンツにこれらの文字を含めることができないため、解析エラーが発生します。 – StaxMan

+0

さて、パーザーがちょうどクラップアウトするのはちょっとイライラします。私は、入力された制御文字を処理(および圧縮)するためにモデルを更新しています。 –

答えて

2

あなたが見ている問題は少し知られていますが、XMLでは非常に深刻な欠陥です。簡単に言えば、xml値には特定の文字を含めることはできません。xmlテキストに含めることはできませんが、& #DDDDを使用してエスケープすることもできません。表記

有効なXML文字セットは、http://www.w3.org/TR/REC-xml/#charsetsであり、#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

つまり、文字列にこの文字セットに含まれていない文字が含まれている場合、XML値にシリアル化することはできません。このような文字列を格納する唯一の方法は、それをバイナリデータとしてbase64にシリアル化することです。

MSXMLと.NETを含む多くの一般的なフレームワークは、悪いデータをXML値に入れて、そのようなXMLを逆シリアル化することを拒否します。 http://vvcap.net/db/Db94W-13uwCkNXSZTitO.htp、およびソースコード:ここでは例として、スクリーンショットだ

using System; 
using System.Xml.Serialization; 
using System.Xml; 

[Serializable] public class TestClass 
{ 
    [XmlAttribute] 
    public string Member { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var ser = new XmlSerializer(typeof(TestClass)); 
     var tc = new TestClass() { Member = "zzz \x19 zzz" }; 
     var stream = new System.IO.StringWriter(); 
     ser.Serialize(stream, tc); 
     var xml = stream.ToString(); 
     var stream2 = new System.IO.StringReader(stream.ToString()); 
     var tc2 = ser.Deserialize(stream2); 
    } 
}