无法在XMLParser中设置iVars
问题描述:
我在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)
答
你的问题是,你已经有了一个XMLParser
三个实例,你可以设置实例变量:
- 本地
NSXMLParser *parser
分配里面parseXMLAtURL:
, - 功能静电
static XMLParser *XMLStore
内sharedStore
分配,并 - 实例变量
XMLParser *XMLStore;
你从未分配,因此它保持nil
。
这是您尝试拨打您的设定人员的第三个实例。由于它是nil
,通话没有影响:[XMLStore setLongitudeValue:...]
什么都不做。
要解决此问题,请删除第二个和第三个变量以及+(XMLParser *)sharedStore
方法。使用常规实例属性,而不是访问共享的属性。
NSLog(@"Long:%@, Lat:%@", parser.longitudeValue, parser.latitudeValue);
+0
谢谢,我没有完全按照你所说的做,但我精简了一切,现在它正在工作。太感谢了。 –
,能得到任何崩溃:
您可以将
[parser parse]
通话结束后收获来自本地parser
变量的结果? Bcz你的问题不清楚。 – Ganapathy没有崩溃,但是当我调用这个类的时候,底部的NSLogs为currentNodeContent返回一个值,但是不会为iVars:latitude/longitudeValue返回值,它们在适当的时候都被设置为currentNodeContent的值。当然,我得到的地方(空)我应该给坐标。 –