1

やあみんな、私はXMLを使用してデータを保存するアプリケーションを持っています。最近、データファイルを開くことができないユーザーからバグレポートを受け取りました。パーサーは、不良文字に遭遇したときに明らかに失敗しました。

幸い、彼女のデータファイルのコピーを持っているので、犯人を見つけることができましたが、それが何であるか、どのようにしてそこに到達したのかわかりません。(これはすべてユーザーからのキーボード入力であるため。)問題のある文字は次のとおりです。

attributeName="Some text then XXX"

16進エディタによると、「XXX」は次のとおりです。

0A 0A 00

0Aは、私が知る限り、改行ですが、ヌル文字がそこに到達するのは一体どういうことでしょうか。これは私がこの性質で見た最初のバグです。

4

1 に答える 1

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);
    }
}
于 2011-01-06T00:31:54.747 に答える