2011-05-25 96 views
0

我有一個應用程序,我使用nsxmlparser來解析XML。但我沒有XML文件。我有一個生成XML文件的API方法。我在控制檯中生成了xml文件。但問題是我不知道如何解析API方法。我寫了下面的代碼,但它不會產生輸出。如何在iPhone中使用API​​方法解析XML文件?

TWeatherElement.h

//This is my element class . 
#import <Foundation/Foundation.h> 

@interface TWeatherElement : NSObject 
{ 
    NSString *mIcon; 
    NSString *mCurrentdate; 
    NSString *mConditionname; 
    NSString *mMintemp; 
    NSString *mMaxtemp; 
    NSString *mWind; 
    NSString *mHumidity; 
} 

@property (nonatomic,retain) NSString *icon; 
@property (nonatomic, retain)NSString *currentdate; 
@property (nonatomic,retain)NSString *conditionname; 
@property (nonatomic,retain)NSString *mintemp; 
@property (nonatomic, retain)NSString *maxtemp; 
@property (nonatomic, retain)NSString *wind; 
@property (nonatomic, retain)NSString *humidity; 

@end 

TWeatherElement.m

#import "TWeatherElement.h" 

@implementation TWeatherElement 
@synthesize icon = mIcon; 
@synthesize currentdate = mCurrentdate; 
@synthesize conditionname = mConditionname; 
@synthesize mintemp = mMintemp; 
@synthesize maxtemp = mMaxtemp; 
@synthesize wind = mWind; 
@synthesize humidity = mHumidity; 

-(void)dealloc 
{ 
    [mIcon release]; 
    //[mForecastdate release]; 
    [mCurrentdate release]; 
    [mConditionname release]; 
    [mMintemp release]; 
    [mMaxtemp release]; 
    [mWind release]; 
    [mHumidity release]; 
    [super dealloc]; 
} 

@end 

TWeatherParser.h

//TWeatherParser is my parser class 
#import "TWeatherElement.h" 
#import <Foundation/Foundation.h> 

@interface TWeatherParser : NSObject<NSXMLParserDelegate> 
{ 
    NSMutableArray *mParserArray; 
    NSXMLParser *mXmlParser; 
    NSMutableString *mCurrentElement; 
    BOOL elementFound; 
    TWeatherElement *mWeather; 
} 
@property (nonatomic, retain) NSMutableString *currentElement; 
@property (nonatomic, retain) TWeatherElement *weatherobj; 

-(void)getInitialiseWithData:(NSData *)inData; 

@end 

TWeatherParser.m

#import "TWeatherParser.h" 
#import "JourneyAppDelegate.h" 
//#define kParsingFinishedNotification @"ParsingFinishedNotification" 

@implementation TWeatherParser 
@synthesize weatherobj = mWeatherobj; 
@synthesize currentElement = mCurrentElement; 

-(void)getInitialiseWithData:(NSData *)inData 
{ 
    mWeather = [[TWeather alloc]init]; 
    [mParserArray removeAllObjects]; 
    NSBundle* bundle = [NSBundle mainBundle]; 

    //This is to get to the path of the xml file named contact_data, but 
    //my problem is I don't have an XML file. My XML file is generated 
    //through an API method, [(NSString *)getBusXMLAtStop:(NSString*)stopnumber] 

    What should I write here so that I can parse my XML file which 
    is retrieving through the above below API method? 

} 

API METHOD: 
-(NSString *)getBusXMLAtStop:(NSString*)stopnumber 
{ 
    NSError *error; 
    NSURLResponse *response; 
    NSData *dataReply; 
    NSString *stringReply; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: 
            [NSURL URLWithString: [NSString stringWithFormat:@"http://www.google.com/ig/api?weather=,,,50500000,30500000",stopnumber]]]; 
    [request setHTTPMethod: @"GET"]; 
    dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
    //NSString *str; 
    stringReply = [[NSString alloc] initWithData:dataReply encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",stringReply); 
    return stringReply; 
} 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString*) elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString*)qualifiedName attribute:(NSDictionary*)attributeDict 
{ 
    if (nil!= qualifiedName) 
    { 
     elementName = qualifiedName; 
    } 
    if ([elementName isEqualToString:@"weather"]) 
    { 
     self.weatherobj = [[TWeatherElement alloc]init]; 
    } 
    else if([elementName isEqualToString:@"current_date_time data"]|| 
      [elementName isEqualToString:@"condition data"]|| 
      [elementName isEqualToString:@"humidity data"]|| 
      [elementName isEqualToString:@"icon data"]|| 
      [elementName isEqualToString:@"wind_condition data"]|| 
      [elementName isEqualToString:@"low data"]|| 
      [elementName isEqualToString:@"high data"]) 
    { 
     self.currentElement = [NSMutableString string]; 
    } 
    else 
    { 
     self.currentElement = nil; 
    } 
} 

-(void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string 
{ 
    if (nil!= self.currentElement) 
    { 
     [self.currentElement appendString:string]; 
    } 
} 

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName 
{ 
    if (nil != qName) 
    { 
     elementName = qName; 
    } 
    if ([elementName isEqualToString:@"current_date_time data"]) 
    { 
     self.weatherobj.currentdate = self.currentElement; 

    } 
    else if ([elementName isEqualToString:@"condition data"]) 
    { 
     self.weatherobj.conditionname = self.currentElement; 

    } 
    else if ([elementName isEqualToString:@"humidity data"]) 
    { 
     self.weatherobj.humidity = self.currentElement; 

    } 
    else if ([elementName isEqualToString:@"icon data"]) 
    { 
     self.weatherobj.icon = self.currentElement; 

    } 
    else if ([elementName isEqualToString:@"wind_condition data"]) 
    { 
     self.weatherobj.wind = self.currentElement; 

    } 
    else if ([elementName isEqualToString:@"low data"]) 
    { 
     self.weatherobj.mintemp = self.currentElement; 

    } 
    else if ([elementName isEqualToString:@"high data"]) 
    { 
     self.weatherobj.maxtemp = self.currentElement; 

    } 

    else if ([elementName isEqualToString:@"weather"]) 
    { 
     [mParserArray addObject:self.weatherobj]; 
     NSLog(@"mDataArray count = %d",[mParserArray count]); 
     [self.weatherobj release]; 
    } 
} 

-(void)dealloc 
{ 
    self.weatherobj = nil; 
    self.currentElement = nil; 
    [super dealloc]; 
} 
@end 

如何調用API方法在getInitialiseWithData函數,這樣我可以解析我的XML文件?

+0

從API獲取包含XML的字符串並傳遞字符串而不是文件 – Radu 2011-05-25 07:03:46

回答

0

獲取包含來自API的XML字符串,並把這個字符串(它必須有一個函數,它的字符串)。

或者只是把串入NSData的,

NSData* data=[stringContainingXML dataUsingEncoding:NSUTF8StringEncoding]; 

你需要使用一個解析器庫,libxml的,touchxml,或的NSXMLParser。看看谷歌,並做一個簡單的教程。之後,你應該沒有問題。 我建議touchxml。我從來沒有使用它,但我聽說與其他方法相比,它很容易使用。

祝你好運夥計。

+0

是否需要更改getInitializeWithData函數 – Rocky 2011-05-25 07:14:57

+0

我已將字符串添加到api方法中 – Rocky 2011-05-25 07:16:32

+0

這是否爲iphone?如果母豬在解析http://codesofa.com/blog/archive/2008/07/23/make-nsxmlparser-your-friend.html時查看tutoriol – Radu 2011-05-25 08:14:10

0

你能不能利用的+(id)dataWithContentsOfURL:(NSURL *)aURL代替contentsOfFile: