我已经在objective中创建了一个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)发布于 2013-09-23 10:50:17
您的问题是,您有三个XMLParser实例,可以在其中设置实例变量:
NSXMLParser *parser分配到parseXMLAtURL:中,static XMLParser *XMLStore在sharedStore中分配,以及XMLParser *XMLStore;,您从不分配它,所以它保持为nil。这是您尝试调用setter的第三个实例。因为它是nil,所以调用没有效果:[XMLStore setLongitudeValue:...]什么也不做。
要解决这个问题,请删除第二个和第三个变量以及+(XMLParser *)sharedStore方法。使用常规实例属性,而不是访问共享实例属性。
您可以在完成parser调用后从本地[parser parse]变量获取结果:
NSLog(@"Long:%@, Lat:%@", parser.longitudeValue, parser.latitudeValue);https://stackoverflow.com/questions/18956990
复制相似问题