XML資料解析(系統方法),xml資料解析方法
XML是一種自描述的資料交換格式。是一種非常重要的資料交換 格式,多年來一直用於各種電腦語言中。XML類似HTML,有一對對標籤對,格式比HTML嚴謹,一個<>開始,一個</>結尾.
解析的內容為:
<users> <user id="001"> <name>張三</name> <password>123456</password> <nickname>小張</nickname> <description>1111111111</description> </user> <user id="002"> <name>張三</name> <password>2222222</password> <nickname>小四兒</nickname> <description>李四是個好學生</description> </user> <user id="003"> <name>張三</name> <password>88888888</password> <nickname>小五</nickname> <description>1234567890</description> </user> </users>
事先已將資料讀取並儲存在data中.
建立一個類,繼承自NSObject,命名為userInfo
@property(nonatomic,copy)NSString *uID;@property(nonatomic,copy)NSString *name;@property(nonatomic,copy)NSString *password;@property(nonatomic,copy)NSString *nickname;@property(nonatomic,copy)NSString *description;
再建立一個類,同樣繼承自NSObject,命名為userParser,實現xml檔案的讀取.
userParser.h
#import <Foundation/Foundation.h>#import "user.h"@interface userParser : NSObject<NSXMLParserDelegate>//儲存資訊的數組@property(nonatomic,retain)NSMutableArray *array;//執行個體@property(nonatomic,retain)user *people;//建立字串儲存資訊@property(nonatomic,copy)NSMutableString *buffer;//讀取xml檔案-(void)parserWithString:(NSString *)string;@end
userparser.m
#import "userParser.h"@implementation userParser-(void)parserWithString:(NSString *)string{ //使用系統XML解析方法 NSXMLParser *parser=[[NSXMLParser alloc]initWithData:[string dataUsingEncoding:NSUTF8StringEncoding]]; //設定代理 parser.delegate=self; //開始解析 [parser parse];}#pragma mark ---NSXMLParserDelegate---//開始解析- (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"it begin");}//解析結束- (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"it is over"); for (int i=0; i<_array.count; i++) { user *user=_array[i]; NSLog(@"%@,%@,%@,%@,%@",user.uID,user.name,user.password,user.nickname,user.description); }}//遇到開始標籤//attributeDict標籤屬性- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{ if ([elementName isEqualToString:@"users"]) { _array=[[NSMutableArray alloc]init]; } else if ([elementName isEqualToString:@"user"]) { _people=[[user alloc]init]; //<user id="3"> _people.uID=[attributeDict objectForKey:@"id"]; } else if ([elementName isEqualToString:@"name"]) { _buffer=[[NSMutableString alloc]init]; } else if ([elementName isEqualToString:@"password"]) { _buffer=[[NSMutableString alloc]init]; } else if ([elementName isEqualToString:@"nickname"]) { _buffer=[[NSMutableString alloc]init]; } else if ([elementName isEqualToString:@"description"]) { _buffer=[[NSMutableString alloc]init]; } }//結束標籤- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ if ([elementName isEqualToString:@"name"]) { _people.name=_buffer; } else if ([elementName isEqualToString:@"password"]) { _people.password=_buffer; } else if ([elementName isEqualToString:@"nickname"]) { _people.nickname=_buffer; }else if ([elementName isEqualToString:@"description"]) { _people.description=_buffer; } else if ([elementName isEqualToString:@"user"]) { [_array addObject:_people]; }}//讀取內容- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ //NSCharacterSet字串結合,取出字串中的空格 [_buffer appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];}
在viewcontroller中,建立userparser的執行個體對象,通過parserWithString方法實現資料解析
userParser *uparser=[[userParser alloc]init];
[uparser parserWithString:user];
注:將資料解析與介面顯示分開寫有助於減低程式的耦合,同時也符合MVC編程模式.