2011-10-23 60 views
0

我想将一些xml数据存储到字典中,但由于某种原因,当我运行XMLParser的方法时,我尝试设置的数组和字典数据未设置。 XML数据在那里,我可以记录它并查看elementName和stringValues,但我似乎无法将它们插入数组或字典中。不知道我做错了什么。可可:XML解析

这是我的.h文件:

#import <Cocoa/Cocoa.h> 

@interface AppController : NSObject { 


    IBOutlet id txtSpeechBox; 
    IBOutlet id btnSpeechBtn; 

    NSSpeechSynthesizer* synth; 
    NSURL* urlToPass; 
    NSXMLParser* dataParser; 

    NSMutableDictionary* dataDict; 
    NSMutableArray* dataKeys; 

    NSString* currentKey; 
    NSMutableString* currentStringValue; 

} 

- (void) parseXMLFile : (NSURL *) url; 
- (void) speakJasper; 

和我的.m文件:

#import "AppController.h" 

@implementation AppController 
- (void) awakeFromNib { 
//set up our speech synth 
synth = [[NSSpeechSynthesizer alloc] init]; 

//go and grab the weather data 
urlToPass = [[NSURL alloc] initWithString:@"http://www.weather.gov/xml/current_obs/KPTW.xml"]; 

NSData *data = [NSData dataWithContentsOfURL: urlToPass]; 
NSString *weatherData = [[NSString alloc] initWithData:data encoding:NSMacOSRomanStringEncoding]; 

[self parseXMLFile:urlToPass]; 
//NSLog(weatherData); 

dataDict = [[NSMutableDictionary alloc] init]; 
dataKeys = [[NSMutableArray alloc] init]; 
[dataKeys addObject:@"test line"]; 
currentKey = [[NSString alloc] init]; 

[dataDict, dataKeys release]; 
} 

- (void) parseXMLFile : (NSURL *) url { 
BOOL success; 
if (dataParser) // addressParser is an NSXMLParser instance variable 
     [dataParser release]; 
     dataParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
     [dataParser setDelegate:self]; 
     [dataParser setShouldResolveExternalEntities:YES]; 
     success = [dataParser parse]; // return value not used 
// if not successful, delegate is informed of error 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ 
currentKey = nil; 
[currentStringValue release]; 
currentStringValue = nil; 

currentKey = [NSString stringWithFormat: @"%@", elementName]; 
return; 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
if(!currentStringValue){ 
    currentStringValue = [[NSMutableString alloc] init]; 
} 
[currentStringValue appendString:string]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
[dataKeys addObject:currentKey]; 
[dataDict setObject:currentStringValue forKey:currentKey]; 
[dataKeys addObject:@"test"]; 
[self speakJasper]; 
} 

- (void) speakJasper { 
//set up a string for what jasper will say 
NSMutableString* speakString = [[NSMutableString alloc] init]; 
speakString = @"Good morning, the current weather is"; 

//start looping through the dataKeys array to get the dataDict keys, take that value and add to speak string 
for(int d=0; d<dataKeys.count; d++) { 
    NSString* thisDataKey = [dataKeys objectAtIndex:d]; 
    if (thisDataKey == @"weather") { 
     NSString* thisDataValue = [dataDict objectForKey:thisDataKey]; 
     [speakString appendString:thisDataValue]; 
    } 
} 
NSLog(@"%i", dataKeys.count); 
//[synth startSpeakingString:speakString]; 
} 
@end 
+2

“不知道我做错了什么”不是问题。如果您想让某人梳理您的代码,请查看http://codereview.stackexchange.com/。 –

回答

1

你初始化你的字典和钥匙XML文件后已经被解析:

[self parseXMLFile:urlToPass]; 
dataDict = [[NSMutableDictionary alloc] init]; 
dataKeys = [[NSMutableArray alloc] init]; 

so dataDict和dataKeys都为零作为didStartElement:,foundChars: and endElement:被调用。

将第一行移到下两行下方,您将获得数据。

+0

感谢皮卡史蒂夫,这就是你在星期天早上得到的编码... – PruitIgoe