无法在XMLParser中设置iVars

问题描述:

我在objective-c中创建了一个XMLParser类,并且我无法在解析器过程中的共享存储中设置iVars,我尝试了很多方法,但我无处可去。无法在XMLParser中设置iVars

这是我的代码和正在返回的内容,希望这是我忽略的一个小的语法错误。

.H

@interface XMLParser : NSXMLParser <NSXMLParserDelegate> 
{ 
    XMLParser *XMLStore; 
} 

@property(nonatomic, weak)NSMutableString *longitudeValue; 
@property(nonatomic, weak)NSMutableString *latitudeValue; 

+ (XMLParser *)sharedStore; 
- (void)parseXMLAtURL:(NSURL *)url; 

@end 

.M

#import "XMLParser.h" 

@implementation XMLParser 

BOOL blockLatLong = NO; 
NSMutableString *currentNodeContent; 

+ (XMLParser *)sharedStore 
{ 
    static XMLParser *XMLStore = nil; 
    if (!XMLStore) 
     XMLStore = [[XMLParser alloc] init]; 

    return XMLStore; 
} 

- (void)parseXMLAtURL:(NSURL *)url 
{ 
    NSXMLParser *parser = [[XMLParser alloc] initWithContentsOfURL:url]; 

    parser.delegate = self; 

    [parser setShouldProcessNamespaces:NO]; 
    [parser setShouldReportNamespacePrefixes:NO]; 
    [parser setShouldResolveExternalEntities:NO]; 

    [parser parse]; 
    NSLog(@"Long:%@, Lat:%@", XMLStore.longitudeValue, XMLStore.latitudeValue); 
} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    currentNodeContent = [NSMutableString stringWithString:string]; 
} 




-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    if ([elementName isEqualToString:@"geometry"]){ 
     blockLatLong = YES; 
    } 

    if ([elementName isEqualToString:@"location_type"]){ 
     blockLatLong = NO; 
    } 
} 




- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if (blockLatLong){ 

    if ([elementName isEqualToString:@"lng"]){ 
     [XMLStore setLongitudeValue:currentNodeContent]; 
     NSLog(@"%@", currentNodeContent); 
     NSLog(@"%@", XMLStore.longitudeValue); 
    } 

    if ([elementName isEqualToString:@"lat"]){ 
     [XMLStore setLatitudeValue:currentNodeContent]; 
     NSLog(@"%@", currentNodeContent); 
     NSLog(@"%@", XMLStore.latitudeValue); 
    } 

    } 
} 


@end 

登录

2013-09-23 11:19:59.606 Weathalert[640:c07] 40.7143528 
2013-09-23 11:19:59.606 Weathalert[640:c07] (null) 
2013-09-23 11:19:59.607 Weathalert[640:c07] -74.0059731 
2013-09-23 11:19:59.607 Weathalert[640:c07] (null) 
2013-09-23 11:19:59.607 Weathalert[640:c07] Long:(null), Lat:(null) 
+0

,能得到任何崩溃:

您可以将[parser parse]通话结束后收获来自本地parser变量的结果? Bcz你的问题不清楚。 – Ganapathy

+0

没有崩溃,但是当我调用这个类的时候,底部的NSLogs为currentNodeContent返回一个值,但是不会为iVars:latitude/longitudeValue返回值,它们在适当的时候都被设置为currentNodeContent的值。当然,我得到的地方(空)我应该给坐标。 –

你的问题是,你已经有了一个XMLParser三个实例,你可以设置实例变量:

  1. 本地NSXMLParser *parser分配里面parseXMLAtURL:
  2. 功能静电static XMLParser *XMLStoresharedStore分配,并
  3. 实例变量XMLParser *XMLStore;你从未分配,因此它保持nil

这是您尝试拨打您的设定人员的第三个实例。由于它是nil,通话没有影响:[XMLStore setLongitudeValue:...]什么都不做。

要解决此问题,请删除第二个和第三个变量以及+(XMLParser *)sharedStore方法。使用常规实例属性,而不是访问共享的属性。

NSLog(@"Long:%@, Lat:%@", parser.longitudeValue, parser.latitudeValue); 
+0

谢谢,我没有完全按照你所说的做,但我精简了一切,现在它正在工作。太感谢了。 –