【问题标题】:Parsing XML from an HTTPS URL using NSXMLParser?使用 NSXMLParser 从 HTTPS URL 解析 XML?
【发布时间】:2009-01-07 11:29:04
【问题描述】:

我正在尝试直接从 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 没有显示结果。

我该如何解决这个问题?

【问题讨论】:

    标签: objective-c xml cocoa cocoa-touch parsing


    【解决方案1】:
    1. 任何 initWithContentsOfURL:... 方法都不允许您回答来自 https 服务器的身份验证消息。因此,请查看 NSURLConnectionNSURLDownload,它们具有可帮助您处理身份验证的委托消息。

    2. 要了解有关使用 URL 与服务器通信的更多信息,请阅读 Introduction to the URL Loading System

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

    【讨论】:

    • -[NSString initWithContentsOfURL:] 与 -[NSXMLParser initWithContentsOfURL:] 不同。后者没有被弃用,也没有出现在 encoding:error: 和 usedEncoding:error: variables 中。
    【解决方案2】:

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

    NSURLConnection 更健壮,还允许您执行您绝对应该执行的异步获取,-initWithContentsOfURL: 将阻塞主线程。

    【讨论】:

    • 阻塞主线程这一点可能比其他点更重要。
    【解决方案3】:

    此外,大多数 HTTPS 服务器会检查 User-Agent 字符串,并且在未指定此类标头值时无法正常播放。在 url 请求中包含一些(有效的)用户代理字符串肯定会有所帮助。

    【讨论】:

      【解决方案4】:

      我不确定你是否在做 iPhone 编程,但作为记录,在 NSXMLParser 类参考(在 iPhone 3.0 beta 2 SDK 中)中,initWithContentsOfURL:(NSURL *)url 确实 不是 似乎已被弃用。

      【讨论】:

        猜你喜欢
        • 2016-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 2012-09-02
        • 1970-01-01
        • 2011-09-09
        相关资源
        最近更新 更多