2010-06-28 93 views
8

所以,我在问最后的手段,因为我完全没有想法。对非法字符xml解析错误

我有一个Windows ASP.NET ASMX Web服务应用程序,返回一个序列化Person对象 - 名称,地址,电子邮件...等

但在XML一些属性非常古怪的编码,例如&#x1a(我不知道编码发生在哪里,我假设在序列化过程中)

googling those characters我看到它是“Windows-1252”编码。

问题“无效的Unicode字符”的解析错误在1252编码的位置的XML解析过程中发生,我发现,。

我该如何成功解析它?你建议什么解决方案?

回答

7

解析器是正确的,不管产生的序列化是错误的。与大多数的C0/C1控制字符的,它是无效的,实际上,更糟糕的是:不能很好地形成,把一个U+001A SUBSTITUTE成XML 1.0文件(*),即使编码为字符参照如

没有XML解析器会读这一点,也不应该。虽然您可以在将它们传递给解析器之前尝试过滤掉序列,但这种粗暴的黑客行为在一般情况下不起作用。串行器应该被固定以停止产生它们。

其实我不知道这个字符(通常用于标记古代可怕的操作系统中的文件结尾)是如何进入ASP.NET应用程序使用的数据集的,但它似乎不会播放任何东西姓名,地址或电子邮件中的有效角色。也许你真的需要考虑清理你的数据。 (*:如果在XML 1.1文档中编码为字符引用是合法的,如果您绝对必须使用XML来往返控制字符,则必须使用XML 1.1。虽然这可能会导致兼容性问题与旧的XML解析器,你仍然不能使用U + 0000 NULL字符,所以你永远不会是完全二进制安全)

+0

感谢您的详细回答 - 我假设的数据是从word文件或类似的东西作为复制粘贴输入。 – bushman 2010-06-29 12:58:16

+0

是的,对于范围为0x80-0x9F的C1控制代码(通常来自代码页1252智能引号被误解为ISO-8859-1),这是常见的,但0x1A控制代码不用于任何Word或我能想到的任何其他常见的现代Windows应用程序。 – bobince 2010-06-29 13:20:43

+0

所以鲍勃,我无法控制数据对我来说是如何 - 是否有可怕的黑客攻击并将其从字符串中删除,或者是否有另一种方式来表示它 - 例如在序列化之前 - - 检查字符串是否为UTF-8合法。 – bushman 2010-06-29 13:44:40