NSXMLParser 解析xml詳解
#import "ViewController.h"import "Video.h"
@interface ViewController ()<NSXMLParserDelegate> //存儲對象數組 @property (nonatomic, strong) NSMutableArray videos; // 來回拼接 @property (nonatomic, strong) NSMutableString elementString; // 當前視頻信息的對象 @property (nonatomic, strong) Video *video; @end
@implementation ViewController
(void)viewDidLoad { [super viewDidLoad];
// 加載數據方法 [self loadData]; }
pragma mark - 加載數據
(void)loadData { // data NSString path = [[NSBundle mainBundle] pathForResource:@"video.xml" ofType:nil]; NSData data = [NSData dataWithContentsOfFile:path];
// 1>創建,傳遞data NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 2> 設置代理 parser.delegate = self;
// 3> 開始解析 [parser parse];//返回值,判斷是否解析成功
// 4> 解析完成之后的操作 }
pragma mark - XML解析代理方法
pragma mark 1. 開始
(void)parserDidStartDocument:(NSXMLParser *)parser { // NSLog(@"開始解析文檔"); // 準備工作 // 1> dataList self.videos = [NSMutableArray array];
// 2> elementString self.elementString = [NSMutableString string]; }
pragma mark 2. 所有開始一個節點:<element>
(void)parser:(NSXMLParser )parser didStartElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName attributes:(NSDictionary *)attributeDict { NSLog(@"開始節點:=====%@ %@", elementName, attributeDict); // 如果是<video>新建對象 if ([elementName isEqualToString:@"video"]) {
self.video = [[Video alloc] init];
}
// 每開始一個新節點之前都清空elementString // 避免上一次的結果被重復拼接,例如拼完名字是"abc",再拼長度就會變成"vda1234" [self.elementString setString:@""]; }
pragma mark 3. 查找內容,可能會重復多次
- (void)parser:(NSXMLParser )parser foundCharacters:(NSString )string { // 拼接字符串 [self.elementString appendString:string]; }
pragma mark 4. 節點結束 </element>
- (void)parser:(NSXMLParser )parser didEndElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName
{
// NSLog(@"結束節點 %@", elementName);
if ([elementName isEqualToString:@"name"])
{
} else if ([elementName isEqualToString:@"length"]) {self.video.name = self.elementString;
} //將對象添加到數組 else if([elementName isEqualToString:@"video"]) {self.video.length = self.elementString;
}[self.videos addObject:self.video];
}
pragma mark 5. 文檔結束
- (void)parserDidEndDocument:(NSXMLParser )parser
{
for (Video video in self.videos)
{
} }NSLog(@"%@---%@", video.name, video.length);
pragma mark 6. 出錯處理
- (void)parser:(NSXMLParser )parser parseErrorOccurred:(NSError )parseError
{
NSLog(@"%@", parseError.localizedDescription);
} </pre>