使用NSXMLParser从HTTPS URL解析XML?

4
我正在尝试直接从HTTPS URL解析XML,操作步骤如下:
NSString *const URL = @"https://some/HTTPS/url";
NSURL* url = [NSURL URLWithString:URL];
NSXMLParser* parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[parser setDelegate:self];
[parser parse];

我有以下委托方法用于解析器:

- (void) parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
namespaceURI:(NSString *)namespaceURI 
qualifiedName:(NSString *)qualifiedName 
attributes:(NSDictionary *)attributeDict
{
    NSLog(@"Started parsing %@", elementName);
}

这对于HTTP URL似乎可以正常工作,但是对于HTTPS URL没有结果。

我该如何解决这个问题?

4个回答

8
  1. 所有的initWithContentsOfURL:...方法都不能让你回答https服务器发送的认证消息。因此,可以查看NSURLConnectionNSURLDownload,它们具有帮助你处理认证的委托消息。

  2. 要了解更多关于使用URL与服务器通信的信息,请阅读URL加载系统介绍

  3. 如果您想使用XML解析器解析HTML,则只能可靠地处理XHTML。因此,如果您正在创建和解析自己的XHTML文件,那么在大多数情况下应该可以工作。但是,如果您从互联网加载任何HTML文件,则XML解析器通常无法解析该文件。您可能需要查看WebKit


-[NSString initWithContentsOfURL:] 不是与-[NSXMLParser initWithContentsOfURL:] 相同的东西。后者没有被弃用,并且不会以编码:错误:和usedEncoding:错误:变体的形式出现。 - Peter Hosey

4

你应该使用NSURLConnection来下载XML数据,然后解析输出,而不是使用-initWithContentsOfURL:。

NSURLConnection更加健壮,还允许您进行异步获取,这是绝对应该做的,-initWithContentsOfURL:会阻塞主线程。


阻塞主线程的问题可能比其他问题更重要。 - ohadpr

1
此外,大多数HTTPS服务器都会检查User-Agent字符串,并且在未指定此标题值时不会正常工作。在URL请求中使用一些(有效的)User-Agent字符串肯定会有所帮助。

0

我不确定你是否在进行iPhone编程,但是据记录,在NSXMLParser类参考文档中(在iPhone 3.0 beta 2 SDK中),initWithContentsOfURL:(NSURL *)url似乎没有被弃用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接