簡體   English   中英

無法在XMLParser中設置iVars

[英]Cannot set iVars in XMLParser

我已經在Objective-C中創建了XMLParser類,但似乎無法在解析器過程中在共享存儲區中設置iVar,我嘗試了很多方法,但是卻無濟於事。

這是我的代碼以及返回的內容,希望這是我忽略的一個小語法錯誤。

。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)

您的問題是您有三個XMLParser實例,可以在其中設置實例變量:

  1. parseXMLAtURL:分配的本地NSXMLParser *parser
  2. 功能靜態static XMLParser *XMLStore內部分配sharedStore ,和
  3. 實例變量XMLParser *XMLStore; 您永遠不會分配它,因此它保持為nil

這是您嘗試呼叫設置員的第三個實例。 由於為nil ,因此調用無效: [XMLStore setLongitudeValue:...]不執行任何操作。

要解決此問題,請刪除第二個和第三個變量,以及+(XMLParser *)sharedStore方法。 使用常規實例屬性,而不是訪問共享實例屬性。

您可以在[parser parse]調用完成后從本地parser變量中獲取結果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM