在我的iOS应用程序中,我调用WS,它返回一个xml响应。我使用NSXMLParser解析它。在iOS 6上一切正常,直到webservice发生了一点变化。现在我一直在iOS 6上得到这个错误:
出现以下错误:无法完成该操作。(NSXMLParserErrorDomain错误100。)(代码:100)
但是,当我在iOS 7上尝试时,一切都很好。下面是xml响应:
旧xml响应:
<User
xmlns="MyService.Rest.A3.Entities"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<FirstName>George</FirstName>
<LastName>McQuillan</LastName>
<Username>usename</Username>
</User>
新增xml响应:
<User
xmlns="http://www.MyService.Rest.A3.Entities"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<FirstName>George</FirstName>
<LastName>McQuillan</LastName>
<Username>usename</Username>
</User>
所以新的响应只能在iOS 7上工作,在iOS 6上不行。我注意到旧响应的第一个xmlns不是链接,但为什么它能在iOS 7上工作呢?
2条答案
按热度按时间cngwdvgl1#
我的经历正好相反,
xmlns="MyService.Rest.A3.Entities"
在iOS 6中调用parseErrorOccurred
,但在iOS 7中没有。在我的测试中,xmlns="http://www.MyService.Rest.A3.Entities"
在iOS 6和7中都成功了。iOS 6中的
NSXMLParser
似乎会验证命名空间是否是有效的绝对URI。iOS 7不会。带有xmlns="MyService.Rest.A3.Entities"
的命名空间不是有效的绝对URI。如果您通过xmllint
(Mac上通过终端应用程序提供的命令行程序)运行该命令,它也会报告该命名空间无效:幸运的是,这个错误只是信息性的,解析会继续,所以如果你被这个XML卡住了,你可能只想优雅地检测并忽略它,例如:
最好修复XML,使其具有有效的URI。
顺便说一句,XML Namespaces Specification指出,相对URI的使用已经被弃用,命名空间值应该是空的或绝对URI。因此,可以理解为什么iOS 6报告错误,但鉴于
parseErrorOccurred
仅用于致命错误,iOS 7的行为可能更正确,不再为这个非致命警告调用此方法。r3i60tvu2#
如果实现以下NSXMLParserDelegate方法
然后你可以记录NSError并确定它认为发生了什么。当然,它可能会给予你同样的错误代码100,因为你正在接收,但它可能有更多有用的信息。