XML解析之SAX详解

XML解析之SAX详解

本文属于作者原创 http://www.cnblogs.com/ldnh/

XML解析的五个步骤

  • 1、打开文档

  • (void)parserDidStartDocument:(NSXMLParser *)parser ;

  • 2、开始查找起始标签

  • (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;

  • 3、获取标签内容

  • (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

  • 4、查找结束标签

  • -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

  • 5、查询文档结束

  • (void)parserDidEndDocument:(NSXMLParser *)parser {

解析详细代码

import "ViewController.h"

import "JKPTrainInfo.h"

@interface ViewController ()<UITableViewDataSource,NSXMLParserDelegate>

@property (nonatomic,strong) NSMutableArray *dataList;

@property (nonatomic,strong) UITableView *tableView;

//因为下面多次要用,所以要建一个全局变量
@property (nonatomic,strong) JKPTrainInfo *currentInfo;

@property (nonatomic,strong) NSMutableString *muString;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//加载视图
[self initUI];
//加载数据
[self loadData];

}

pragma mark -getter and setter methods

-(NSMutableArray *)dataList
{
if (!_dataList) {

_dataList = [NSMutableArray array];
}
return _dataList;
}

-(UITableView *)tableView
{
if (!_tableView) {

_tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];

_tableView.dataSource = self;
}
return _tableView;
}

- (NSMutableString *)muString
{
if (!_muString) {
_muString = [NSMutableString string];
}

return _muString;
}

pragma mark - UITableView dataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return self.dataList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString * identifiter = @"cellID";

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:identifiter];

if (!cell) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifiter];
}
JKPTrainInfo *JkpInfo = self.dataList[indexPath.row];

cell.textLabel.text = JkpInfo.trainStation;

cell.detailTextLabel.text = JkpInfo.arriveTime;

return cell;
}

pragma mark - NSXMLParserDelegate

//1. 打开文件,开始解析
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"打开文件,开始解析");

//每次解析前进行清空操作-防止多次加载重复数据

[self.dataList removeAllObjects];
}

//2. 查找起始标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{

// NSLog(@"%@",elementName);
//
// NSLog(@"%@",attributeDict);

if ([elementName isEqualToString:@"trainDetailInfo"]) {

self.currentInfo = [[JKPTrainInfo alloc]init];

[self.currentInfo setValuesForKeysWithDictionary:attributeDict];
}

//清空muString 数据
self.muString.string = @"";
}

//3.获取标签内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// NSLog(@"%@",string);

//防止多次执行获取内容的方法
[self.muString appendString:string];
}

// 4.查找结束标签
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// NSLog(@"%@",elementName);

if ([elementName isEqualToString:@"trainDetailInfo"]) {

[self.dataList addObject:self.currentInfo];
}

else if (![elementName isEqualToString:@"dataSet"]&&![elementName isEqualToString:@"diffgr:diffgram"])
{
// self.muString是数据内容
[self.currentInfo setValue:self.muString forKey:elementName];
}

}

//5.解析完成
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"解析完成");

//解析完成后刷新数据
[self.tableView reloadData];
}

pragma mark - event handle methods

- (void)loadData
{
NSString *urlString = @"http://192.168.1.68/train.xml";

NSURL *url = [NSURL URLWithString:urlString];

NSURLRequest *requst = [NSURLRequest requestWithURL:url];

[NSURLConnection sendAsynchronousRequest:requst queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

//XML解析
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];

parser.delegate = self;

[parser parse];

}];

}

- (void)initUI
{
[self.view addSubview:self.tableView];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

posted @ 2016-03-19 11:12  往事亦如风  阅读(698)  评论(3)    收藏  举报