2013-07-20 56 views
2

我试图解析其中的应用程序委托的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?感谢名单。

+1

落实'解析器解析它之前从网站上下载的xml:parseErrorOccurred:'委托方法,看看是什么错误。 – rmaddy

+0

嗨rmaddy,我使用委托方法,参数'parseError'的代码是'5',字典只是空的。 – Malloc

+0

您是否100%确定XML文档格式正确?解析XML时出现错误代码5是“NSXMLParserPrematureDocumentEndError”。你可以创建一个'NSURLConnection'来使用'sendSynchronousRequest:'从相同的URL下载文件,并将响应输出到控制台? –

回答

0

也许这是一个错误的ARC,尝试建立XMLParser的作为一个强大的属性,以便在完成解析文件之前不会解除分配。

您可能需要使用NSURLConnection的

+0

昨天睡觉前我敢打赌,今天早上醒来时我尝试了第一件事。这正是问题所在,我不得不使'NSXMLParser'一个强大的属性(对于ARC术语前的术语来说,“保留”)。 – Malloc

0

有没有理由让你的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" 
} 
+0

这是否适合你? – Malloc

+0

该代码被剥离并从我现在打开的项目重构...并与上面的示例进行了网格划分。所以,是的,代码背后的基础和逻辑起作用。我是否在某个地方制造了一个错字?有可能。 – Dan