iOS:iOS 6上的NSXMLParser错误(代码100)

xvw2m8pv  于 2023-04-22  发布在  iOS
关注(0)|答案(2)|浏览(128)

在我的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上工作呢?

cngwdvgl

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上通过终端应用程序提供的命令行程序)运行该命令,它也会报告该命名空间无效:

$ xmllint old.xml 

old.xml:2: namespace warning : xmlns: URI MyService.Rest.A3.Entities is not absolute
  xmlns="MyService.Rest.A3.Entities" 
                                    ^
<?xml version="1.0"?>
<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卡住了,你可能只想优雅地检测并忽略它,例如:

if (!([error.domain isEqualToString:NSXMLParserErrorDomain] && error.code == 100)) {
    // do your error handling here, ignoring `NSXMLParserErrorDomain` code 100
    NSLog(@"%@", error);
}

最好修复XML,使其具有有效的URI。
顺便说一句,XML Namespaces Specification指出,相对URI的使用已经被弃用,命名空间值应该是空的或绝对URI。因此,可以理解为什么iOS 6报告错误,但鉴于parseErrorOccurred仅用于致命错误,iOS 7的行为可能更正确,不再为这个非致命警告调用此方法。

r3i60tvu

r3i60tvu2#

如果实现以下NSXMLParserDelegate方法

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError

然后你可以记录NSError并确定它认为发生了什么。当然,它可能会给予你同样的错误代码100,因为你正在接收,但它可能有更多有用的信息。

相关问题