委托方法不叫和解析属性始终为false
问题描述:
我试图解析其中的应用程序委托的XML饲料didFinishLaunchingWithOptions:
方法:委托方法不叫和解析属性始终为false
//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
?感谢名单。
答
也许这是一个错误的ARC,尝试建立XMLParser的作为一个强大的属性,以便在完成解析文件之前不会解除分配。
您可能需要使用NSURLConnection的
+0
昨天睡觉前我敢打赌,今天早上醒来时我尝试了第一件事。这正是问题所在,我不得不使'NSXMLParser'一个强大的属性(对于ARC术语前的术语来说,“保留”)。 – Malloc
答
有没有理由让你的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"
}
落实'解析器解析它之前从网站上下载的xml:parseErrorOccurred:'委托方法,看看是什么错误。 – rmaddy
嗨rmaddy,我使用委托方法,参数'parseError'的代码是'5',字典只是空的。 – Malloc
您是否100%确定XML文档格式正确?解析XML时出现错误代码5是“NSXMLParserPrematureDocumentEndError”。你可以创建一个'NSURLConnection'来使用'sendSynchronousRequest:'从相同的URL下载文件,并将响应输出到控制台? –