標籤:
// xml檔案的樣式 的樣式有多種樣式,標準的是把資料存放在子節點中,還有就是比較簡單的讀取就是把資料直接存在屬性裡面
// 第一種,這是自己寫出來的一種,把資料存放區在子節點中,讀取相對麻煩一些
// 第二種是從中國氣象網的api上街區出來的一段,是把資料存放區在了屬性中,比較容易讀取資料
// 下面是解析第一種樣式的代碼:// 標頭檔
#import
@interface RootViewController : UIViewController<</span>NSXMLParserDelegate>
#pragma mark - 聲明--屬性
@property (nonatomic, retain) NSMutableArray *messageeListArray; // 資料存放區的地方
@property (nonatomic, retain) NSString *fromTagFlag; // 開始標籤
@end
// 實現檔案
#import "RootViewController.h"
@interface RootViewController ()
@end
@implementation RootViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// 擷取xml字串類型檔案名稱
NSString *xmlDocPath = [[NSBundle mainBundle] pathForResource:@"document"ofType:@"xml"];
// 把字串類型的網址轉為NSURL類型
NSURL *url =[[NSURL alloc] initFileURLWithPath:xmlDocPath];
// 使用url執行個體化網路請求執行個體
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 同步讀取到網路上的資料
NSData *urlData = [NSURLConnection sendSynchronousRequest:requestreturningResponse:nil error:nil];
// 執行個體化一個具體的解析類對象
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:urlData];
// 設定該解析類對象的代理
xmlParser.delegate = self;
// 調用方法開始解析xml檔案
[xmlParser parse];
}
#pragma mark - NSXMLParser Delegate -
#pragma mark 文檔開始讀取
- (void)parserDidStartDocument:(NSXMLParser *)parser {
// 執行個體化儲存資料的數組
self.messageeListArray = [NSMutableArray array];
}
#pragma mark 解析標籤開始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
// 首先用屬性fromTagFlag擷取ElementName,供後面使用
self.fromTagFlag = elementName;
// 判斷
if ([elementName isEqualToString:@"Message"]) {
NSString *identifier = [attributeDict objectForKey:@"id"];
NSMutableDictionary *oneDic = [NSMutableDictionary dictionary];
[oneDic setObject:identifier forKey:@"id"];
[self.messageeListArray addObject:oneDic];
}
}
#pragma mark 擷取到標籤對應的資料
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
// 剔除擷取的文本中空格和換行
string = [string stringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]];
NSMutableDictionary *dict = [self.messageeListArray lastObject];
// 判斷from標籤
if ([_fromTagFlag isEqualToString:@"from"] && dict) {
[dict setObject:string forKey:@"from"];
}
// 判斷CDate標籤
if ([_fromTagFlag isEqualToString:@"CDate"] && dict) {
[dict setObject:string forKey:@"CDate"];
}
// 判斷Content標籤
if ([_fromTagFlag isEqualToString:@"Content"] && dict) {
[dict setObject:string forKey:@"Content"];
}
}
#pragma mark - 解析標籤結束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
self.fromTagFlag = nil;
}
#pragma mark 文檔結束讀取
- (void)parserDidEndDocument:(NSXMLParser *)parser {
// 列印擷取到的資料的數組
NSLog(@"%@", self.messageeListArray);
}
#pragma mark - 重寫----dealloc方法
- (void)dealloc {
[_messageeListArray release], _messageeListArray = nil;
[_fromTagFlag release], _fromTagFlag = nil;
// 調用父類的dealloc方法
[super dealloc];
}
@end
// 第二種xml樣式解析的代碼// 標頭檔
#import
@interface RootViewController : UIViewController<</span>NSXMLParserDelegate>
#pragma mark - 聲明--屬性
@property (nonatomic, retain) NSMutableArray *messageeListArray; // 資料存放區的地方
@property (nonatomic, retain) NSString *fromTagFlag; // 開始標籤
@end
// 實現檔案
#import "RootViewController.h"
@interface RootViewController ()
@end
@implementation RootViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// 準備網址的字串資料
NSString *urlString [email protected]"http://flash.weather.com.cn/wmaps/xml/beijing.xml";
// 把字串類型的網址轉為NSURL類型
NSURL *url1 = [[NSURL alloc] initWithString:urlString];
// 使用url執行個體化網路請求執行個體
NSURLRequest *request = [NSURLRequest requestWithURL:url1];
// 同步讀取到網路上的資料
NSData *urlData = [NSURLConnection sendSynchronousRequest:requestreturningResponse:nil error:nil];
// 執行個體化一個具體的解析類對象
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:urlData];
// 設定該解析類對象的代理
xmlParser.delegate = self;
// 調用方法開始解析xml檔案
[xmlParser parse];
}
#pragma mark - NSXMLParser Delegate -
#pragma mark 文檔開始讀取
- (void)parserDidStartDocument:(NSXMLParser *)parser {
// 執行個體化儲存資料的數組
self.messageeListArray = [NSMutableArray array];
}
#pragma mark 解析標籤開始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
// 首先用屬性fromTagFlag擷取ElementName,供後面使用
self.fromTagFlag = elementName;
// 因為資料都是儲存在屬性中的,全都儲存在了attributeDict裡面了,在這裡直接列印下
NSLog(@"%@", attributeDict);
}
#pragma mark 擷取到標籤對應的資料
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
// 因為資料都儲存在了屬性中,所有不需要解析子標籤
}
#pragma mark - 解析標籤結束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
self.fromTagFlag = nil;
}
#pragma mark 文檔結束讀取
- (void)parserDidEndDocument:(NSXMLParser *)parser {
// 列印擷取到的資料的數組
NSLog(@"%@", self.messageeListArray);
}
#pragma mark - 重寫----dealloc方法
- (void)dealloc {
[_messageeListArray release], _messageeListArray = nil;
[_fromTagFlag release], _fromTagFlag = nil;
// 調用父類的dealloc方法
[super dealloc];
}
@end
IOS XML資料的解析