在XML文件奇怪的字符(由用户输入?)
-
25-09-2019 - |
题
嗨,我有使用XML保存数据的应用程序。我最近收到谁是无法打开她的数据文件中的用户的bug报告。当它遇到人品不好解析器显然失败了。
幸运的是,我有她的数据文件的副本,所以我能找到罪魁祸首,但我不知道它是什么,或者如何到达那里。 (由于这是从用户所有的键盘输入。)违规字符是:
attributeName="Some text then XXX"
当 “XXX” 是,根据一个十六进制编辑器:
0A 0A 00
在0A是一个换行符,据我所知道的,但如何赫克将一个空字符结束在那里?这是第一个错误我已经看到了这个性质。
解决方案
我认为你所看到的问题是已知的少,但在XML中非常严重的缺陷。简而言之:XML值不能包含某些字符,而不是只有他们不能在XML文本,但他们甚至不能使用&#DDDD逃脱;符号
有效的XML字符集可以在这里找到: http://www.w3.org / TR / REC-XML /#字符集的,它是:#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);
}
}
不隶属于 StackOverflow