objective-c - XML 文件中的奇怪字符(来自用户输入?)

标签 objective-c xml cocoa null invalid-characters

大家好,我有一个使用 XML 保存数据的应用程序。我最近收到了一位用户的错误报告,该用户无法打开她的数据文件。当解析器遇到错误字符时,它显然失败了。

幸运的是,我有她的数据文件的副本,所以我能够找到罪魁祸首,但我不明白它是什么,也不明白它是如何到达那里的。 (因为这是用户的所有键盘输入。)有问题的字符是:

attributeName="Some text then XXX"

根据十六进制编辑器,“XXX”在哪里:

0A 0A 00

据我所知,0A 是一个换行符,但是空字符到底怎么会出现在那里呢?!这是我第一次看到这种性质的错误。

最佳答案

我认为您所看到的问题是 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);
    }
}

关于objective-c - XML 文件中的奇怪字符(来自用户输入?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4609346/

相关文章:

iphone - MKAnnotationView 自定义图像未显示

php - PHP SimpleXML XPath contains()查找此元素引用的其他元素

c# - 从 XML 文件反序列化 int 数组

objective-c - 将 NSImage 初始化为静态对象

swift - 如何从 NSImage 获取日期

objective-c - Cocoa - 在另一个 xib 上显示 xib

c++ - SEGV_ACCERR 是什么意思?

objective-c - 如何连接到基类中的 IBOutlet 和 IBAction

java - 如何在没有多个包装类的情况下反序列化 XML?

cocoa - 丢失的功能 - 如何获取 XCode 4 中 xib 中包含的字符串的概述?