XML解析之SAX详解

时间:2023-03-08 16:28:41
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