我正在尝试直接从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的结果。
我该如何解决这个问题?
答案 0 :(得分:8)
initWithContentsOfURL:...方法都不允许您从https服务器回复身份验证消息。请查看NSURLConnection和NSURLDownload,其中包含可帮助您处理身份验证的委托消息。
要详细了解如何使用网址与服务器进行通信,请阅读Introduction to the URL Loading System。
就使用XML解析器解析HTML而言,它只能可靠地使用XHTML。因此,如果您正在创建和解析自己的XHTML文件,这些文件在大多数情况下都可以使用。但是,如果要从Internet加载任何HTML文件,则XML解析器通常无法解析该文件。您可能需要查看WebKit。
答案 1 :(得分:4)
您应该使用NSURLConnection下载XML数据,然后解析输出而不是使用-initWithContentsOfURL:。
NSURLConnection更健壮,也允许你进行异步提取,你肯定应该这样做,-initWithContentsOfURL:将阻塞主线程。
答案 2 :(得分:1)
此外,大多数HTTPS服务器都会检查用户代理字符串,并且在未指定此类标头值时无法正常运行。在url请求中有一些(有效的)User-Agent字符串肯定会有所帮助。
答案 3 :(得分:0)
我不确定你是否正在进行iPhone编程,但是为了记录,在NSXMLParser类参考中(在iPhone 3.0 beta 2 SDK中),initWithContentsOfURL:(NSURL *)url执行 NOT 似乎已被弃用。