【问题标题】:delegate methods are not called and parse property is always FALSE不调用委托方法并且解析属性始终为 FALSE
【发布时间】:2013-07-19 10:26:05
【问题描述】:

我正在尝试解析应用程序委托 didFinishLaunchingWithOptions: 方法上的 xml 提要:

//Parse XML Data
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://xxxxxxxxxxxxxxxxx/xml"]];//url is just fine :)
    [xmlParser setDelegate:self];
    BOOL parseState = [xmlParser parse];
    if (parseState) {
        NSLog(@"parse succeeded");
    }else{
        NSLog(@"parse failed");//Always parse failed, parse is always "NO"
    }

委托协议方法(没有被调用):

#pragma mark - NSXMLParserDelegate

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

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    NSLog(@"parser:foundCharacters:");
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"parser:didEndElement:namespaceURI:qualifiedName:");


}

当然,AppDelegate.h 符合NSXMLParserDelegate 协议:

@interface AppDelegate : UIResponder <UIApplicationDelegate,NSXMLParserDelegate>

我错过了什么?为什么不调用协议方法以及为什么[xmlParser parse] 总是返回NO?谢谢。

【问题讨论】:

  • 实现parser:parseErrorOccurred:委托方法,看看错误是什么。
  • 嗨 rmaddy,我用了那个委托方法,参数parseError的代码是5,字典是空的。
  • 您是否 100% 确定 XML 文档格式正确?解析 XML 时的错误代码 5 是 NSXMLParserPrematureDocumentEndError。您能否创建一个NSURLConnection 以使用sendSynchronousRequest: 从同一URL 下载文件,并将响应打印到控制台?

标签: ios nsxmlparser nsxmlparserdelegate


【解决方案1】:

可能是 ARC 错误,尝试将 xmlparser 设置为强属性,以便在完成文件解析之前不会释放它。

您可能希望在使用 nsurlconnection 解析之前从网络下载 xml

【讨论】:

  • 我昨天睡觉前打赌,今天早上我醒来的第一件事就是尝试。这正是问题所在,我必须将 NSXMLParser 设为强大的属性(retain 用于 ARC 之前的术语)。
【解决方案2】:

您在 AppDelegate 中塞满 XML 解析器是有原因的吗?无一例外,我发现总是实例化一个解析器类来处理解析任务是有益的。比如……

myParser.h

@class parseClass;

@interface myXMLParser : NSObject <NSXMLParserDelegate> {

}

- (myXMLParser *) initmyXMLParser;

myParser.m

//I do my instantiating like this so it can only be done once
//If you need to instantiate the class more than once do NOT use dispatch_once!
- (myXMLParser *)initmyXMLParser
{
    static myXMLParser *newInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        newInstance = [[myXMLParser alloc]init];
    });
    return newInstance;
}
//include other delegate methods as well

AppDelegate.m

#import "myParser.h"

NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL      URLWithString:@"http://xxxxxxxxxxxxxxxxx/xml"]];//url is just fine :)
myXMLParser *theParser = [[myXMLParser alloc]initmyUpdateXMLParser];
[xmlParser setDelegate:theParser];
BOOL parseState = [xmlParser parse];
if (parseState) {
    NSLog(@"parse succeeded");
}else{
    NSLog(@"parse failed");//Always parse failed, parse is always "NO"
}

【讨论】:

  • 该代码已从我现在打开的项目中剥离和重构......并与您上面的示例相吻合。所以,是的,代码背后的基础和逻辑是有效的。我是否在某个地方从臀部这样做了一个错字?可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2020-07-04
相关资源
最近更新 更多