XMLファイル内の文字化け(ユーザー入力から?)
-
25-09-2019 - |
質問
やあみんな、私は、XMLを使ってデータを保存するアプリケーションを持っています。私は最近、彼女のデータファイルを開くことができないユーザーからバグレポートを受け取りました。それは悪いキャラクターに遭遇したとき、パーサは明らかに失敗します。
私は犯人を見つけることができたので、は幸いなことに、私は、彼女のデータファイルのコピーを持っているが、私はそれが何であるかを理解していない、またはそれがそこに着きましたか。 (これは、ユーザーからのすべてのキーボード入力されるように)怒ら文字がある:
attributeName="Some text then XXX"
「XXX」はバイナリエディタに応じて、次のとおりです。
0A 0A 00
0Aは、改行は私の知る限りですが、どのように一体だろうまでヌル文字終了が!これは私がこのような性質の見てきた最初のバグです。
解決
私は、あなたが見ているという問題が知られて少しですが、XMLには非常に重大な欠陥だと思います。一言で言えば:XML値は、特定の文字を含めることはできません、とだけでなく、彼らはXMLテキストにすることはできませんが、彼らも使用して&#DDDDエスケープすることはできません。表記
有効なXML文字セットは、ここで見つけることができます: http://www.w3.org / TR / REC-XML /#文字セットに、それがある:#1 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);
}
}