无法在XMLParser中设置iVars

时间:2013-09-23 10:28:49

标签: objective-c nsxmlparser ivars

我在objective-c中创建了一个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)

1 个答案:

答案 0 :(得分:1)

您的问题是您有三个XMLParser实例,您可以在其中设置实例变量:

  1. NSXMLParser *parser内分配了本地parseXMLAtURL:
  2. static XMLParser *XMLStore内分配的函数静态sharedStore
  3. 您永远不会分配的实例变量XMLParser *XMLStore;,因此它保持nil
  4. 这是您尝试呼叫您的二传手的第三个实例。由于它是nil,因此调用无效:[XMLStore setLongitudeValue:...]不执行任何操作。

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

    完成parser来电后,您可以从本地[parser parse]变量中收集结果:

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