首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在iVars中设置XMLParser

无法在iVars中设置XMLParser
EN

Stack Overflow用户
提问于 2013-09-23 10:28:48
回答 1查看 27关注 0票数 1

我已经在objective中创建了一个XMLParser类,并且我似乎无法在解析器进程中设置共享存储中的iVars,我尝试了许多方法,但没有成功。

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

.h

代码语言:javascript
复制
@interface XMLParser : NSXMLParser <NSXMLParserDelegate>
{
    XMLParser *XMLStore;
}

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

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

@end

.m

代码语言:javascript
复制
#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

日志

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-23 10:50:17

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

  1. 本地NSXMLParser *parser分配到parseXMLAtURL:中,
  2. 函数-静态static XMLParser *XMLStoresharedStore中分配,以及
  3. 实例变量XMLParser *XMLStore;,您从不分配它,所以它保持为nil

这是您尝试调用setter的第三个实例。因为它是nil,所以调用没有效果:[XMLStore setLongitudeValue:...]什么也不做。

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

您可以在完成parser调用后从本地[parser parse]变量获取结果:

代码语言:javascript
复制
NSLog(@"Long:%@, Lat:%@", parser.longitudeValue, parser.latitudeValue);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18956990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档