2011-10-23 3 views
0

일부 XML 데이터를 사전에 저장하려고하지만 XMLParser의 메소드를 실행할 때 어떤 이유로 설정하려고하는 배열 및 사전 데이터가 설정되지 않습니다. XML 데이터가 거기에 있으며, 그것을 로그 할 수 있으며 elementName과 stringValues를 볼 수는 있지만 배열이나 사전에 연결할 수는 없습니다. 내가 뭘 잘못하고 있는지 모르겠다. 이미 구문 분석 된 XML 파일 후 사전 및 키를 초기화하고Cocoa : XML 구문 분석

#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

을 :

#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 파일 :

여기 내 .H 파일의

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

그래서 dataDict와 dataKeys는 모두 0이됩니다. 시작 항목 :, foundChars :endElement :이 호출됩니다.

첫 번째 줄을 다음 두 줄 아래로 이동하면 데이터를 가져옵니다.

+0

픽업 스티브에게 감사합니다. 일요일 아침 코딩을 위해 얻은 것입니다 ... – PruitIgoe