2013-09-23 45 views
1

我在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的值。當然,我得到的地方(空)我應該給座標。 –

回答

1

你的問題是,你已經有了一個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

謝謝,我沒有完全按照你所說的做,但我精簡了一切,現在它正在工作。太感謝了。 –