NSXMLParser读取XML文件并将数据显示到TableView上
关于XML,有两种解析方式,分别是SAX(Simple API for XML,基于事件驱动的解析方式,逐行解析数据,采用协议回调机制)和DOM(Document Object Model ,文档对象模型。解析时需要将XML文件整体读入,并且将XML结构化成树状,使用时再通过树状结构读取相关数据,查找特定节点,然后对节点进行读或写)。苹果官方原生的NSXMLParse类库采用第一种方式,即SAX方式解析XML,它基于事件通知的模式,一边读取文档一边解析数据,不用等待文档全部读入以后再解析,所以如果你正打印解析的数据,而解析过程中间出现了错误,那么在错误节点之间的数据会正常打印,错误后面的数据不会被打印。解析过程由NSXMLParserDelegate协议方法回调。
首先先创建一个xml文件就叫做xml.xml吧:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Student>
<pid>1</pid>
<name>Jack</name>
<sex>Male</sex>
<age>18</age>
</Student>
<Student>
<pid>2</pid>
<name>Jodan</name>
<sex>Male</sex>
<age>19</age>
</Student>
<Student>
<pid>3</pid>
<name>Mily</name>
<sex>Female</sex>
<age>18</age>
</Student>
<Student>
<pid>4</pid>
<name>Rena</name>
<sex>Female</sex>
<age>20</age>
</Student>
<Student>
<pid>5</pid>
<name>Amy</name>
<sex>Female</sex>
<age>22</age>
</Student>
<Student>
<pid>6</pid>
<name>Teresa</name>
<sex>Female</sex>
<age>20</age>
</Student>
</Root>
接首创建一个相对应的M
//Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic,copy) NSString *pid;
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *sex;
@property (nonatomic,copy) NSString *age; @end //Person.m
#import "Person.h" @implementation Person @synthesize pid,name,age,sex;
@end
接着添加一个自定义UITableViewCell类就让它叫做CustomTableViewCell.m吧,下一步将用到,代码如下:
//CustomTableViewCell.h
#import <UIKit/UIKit.h> @interface CustomTableViewCell : UITableViewCell @property UILabel *lblName;
@property UILabel *lblSex;
@property UILabel *lblAge; @end //CustomTableViewCell.m
#import "CustomTableViewCell.h" @implementation CustomTableViewCell @synthesize lblAge,lblName,lblSex; - (void)awakeFromNib {
// Initialization code
} - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
UILabel *titleOfNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 60, 20)];
titleOfNameLabel.text = @"姓名:";
UILabel *titleOfAgeLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 40, 60, 20)];
titleOfAgeLabel.text = @"年龄:"; UILabel *titleOfSexLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 70, 60, 20)];
titleOfSexLabel.text = @"性别:"; //titleOfNameLabel.backgroundColor = [UIColor blackColor]; [self addSubview:titleOfNameLabel];
[self addSubview:titleOfAgeLabel];
[self addSubview:titleOfSexLabel]; lblName = [[UILabel alloc] initWithFrame:CGRectMake(80, 10, 100, 20)];
lblAge = [[UILabel alloc] initWithFrame:CGRectMake(80, 40, 100, 20)];
lblSex = [[UILabel alloc] initWithFrame:CGRectMake(80, 70, 100, 20)]; [self addSubview:lblName];
[self addSubview:lblAge];
[self addSubview:lblSex];
}
return self;
} - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated]; // Configure the view for the selected state
} @end
在storyboard内添加一个ViewController并加一个TableView并设置好相应的约束条件后添加一个继承自UIViewController的类估且就叫做XmlToTableViewController,并设置上一步在storyboard添加的ViewController的Customer Class为XmlToTableViewController。
XmlToTableViewController要实现NSXMLParserDelegate这个接口,并选择相应要实现的方法。
//XmlToTableViewController.h
#import "ViewController.h"
#import "Person.h" @interface XmlToTableViewController : ViewController @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (nonatomic,strong) NSXMLParser *parser;
@property (nonatomic,strong) NSMutableArray *personArray;
@property (nonatomic,copy) NSString *currentElement;
@property (nonatomic,strong) Person *person; @end //XmlToTableViewController.m
#import "XmlToTableViewController.h"
#import "CustomTableViewCell.h" @interface XmlToTableViewController () <UITableViewDataSource,UITableViewDelegate,NSXMLParserDelegate> @end @implementation XmlToTableViewController - (void)viewDidLoad {
[super viewDidLoad]; dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); dispatch_async(q1, ^{ }); NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"xml" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
self.parser = [[NSXMLParser alloc] initWithData:data];
//添加代理
self.parser.delegate = self;
self.personArray = [NSMutableArray arrayWithCapacity:];
[self.parser parse]; self.tableView.delegate = self;
self.tableView.dataSource = self;
} //几个代理方法的实现,是按逻辑上的顺序排列的,但实际调用过程中中间三个可能因为循环等问题乱掉顺序
//开始解析
- (void)parserDidStartDocument:(NSXMLParser *)parser {
NSLog(@"parserDidStartDocument");
} -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
self.currentElement = elementName;
if([self.currentElement isEqualToString:@"Student"]) {
self.person = [[Person alloc] init];
}
} //获取节点内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if ([self.currentElement isEqualToString:@"pid"]) {
[self.person setPid:string];
} else if([self.currentElement isEqualToString:@"name"]) {
[self.person setName:string];
} else if([self.currentElement isEqualToString:@"sex"]) {
[self.person setSex:string];
} else if([self.currentElement isEqualToString:@"age"]) {
[self.person setAge:string];
}
} //当一个节点读取完成后
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@"Student"]) {
[self.personArray addObject:self.person];
}
self.currentElement = nil;
} //完成XML文件的读取
-(void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"parserDidEndDocument");
NSLog(@"Student's count is %lu",(unsigned long)[self.personArray count]);
[self.tableView reloadData];
} //MARK:TABLEVIEW
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.personArray count];
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *idenfifier = @"Cell";
//PersoUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:idenfifier];
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:idenfifier];
if (cell == nil) {
//用xib文件先画好
/*cell = [[[NSBundle mainBundle] loadNibNamed:@"PersonUITableViewCell" owner:nil options:nil] firstObject];
Person *currentPerson = [self.personArray objectAtIndex:indexPath.row];
if (currentPerson) {
cell.lblName.text = currentPerson.name;
cell.lblAge.text = currentPerson.age;
cell.lblId.text = currentPerson.pid;
cell.lblSex.text = currentPerson.sex;
}*/ cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:idenfifier]; [tableView registerClass:[CustomTableViewCell class] forCellReuseIdentifier:idenfifier];
}
Person *currentPerson = [self.personArray objectAtIndex:indexPath.row];
if (currentPerson) {
cell.lblName.text = currentPerson.name;
cell.lblAge.text = currentPerson.age;
cell.lblSex.text = currentPerson.sex;
} return cell;
} - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return ;
}
最终的效果:
NSXMLParser读取XML文件并将数据显示到TableView上的更多相关文章
- C#中常用的几种读取XML文件的方法
1.C#中常用的几种读取XML文件的方法:http://blog.csdn.net/tiemufeng1122/article/details/6723764/
- 读取xml文件报错:Invalid byte 2 of 2-byte UTF-8 sequence。
程序读取xml文件后,系统报“Invalid byte 2 of 2-byte UTF-8 sequence”错误,如何解决呢? 1.程序解析xml的时候,出现Invalid byte 2 of 2- ...
- C#读取XML文件的基类实现
刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...
- C#读取XML文件的方法
先写一个xml文件: <?xml version="1.0" encoding="utf-8" ?> <bookste> <!-- ...
- Spring相关:jdom学习:读取xml文件
云课堂马士兵的spring2.5课程中提到的 用JDOM读取XML文件需先用org.jdom.input.SAXBuilder对象的build()方法创建Document对象,然后用Document类 ...
- 在C#中创建和读取XML文件
1.创建简单的XML文件 为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下: 这样会在C盘根目录下创建data2.xml文件,文件内容为 using ...
- Java获取路径方法&相对路径读取xml文件方法
(1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...
- python读取xml文件
关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码.这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件. 什么是 ...
- JAVA读取XML文件数据
XML文档内容如下: <?xml version="1.0" encoding="UTF-8"?> <root> <field t ...
随机推荐
- 「2013-9-14」Change Remote Desktop Port
修改远程桌面服务(Remote Desktop Service)的端口号,有几点原因: 默认是 3389 端口,也是经常被端口嗅探器扫描的一个端口.更换端口号,一定程度上可以带来更好的安全性. 如果一 ...
- Windows Phone 8.1 新特性 - 控件之应用程序栏
2014年4月3日的微软Build 2014 大会上,Windows Phone 8.1 正式发布.相较于Windows Phone 8,不论从用户还是开发者的角度,都产生了很大的变化.接下来我们会用 ...
- 『TCP/IP详解——卷一:协议』读书笔记——01
从今日起开始认真研读TCP/IP详解这本经典制作,一是巩固我薄弱的计算机网络知识,二来提高我的假期的时间利用率.将心得与思考记录下来,防止白看-哦耶 2013-08-14 18:47:06 第一章 概 ...
- javascript基础知识-语句
关于javascript语句,有下面一些有趣的用法. 1.空语句的使用: 空语句只包含一个";",那在什么时候可以使用呢? 例: //初始化一个数组a for(i = 0;i &l ...
- "产品测试管理&敏捷项目管理"研讨会在深圳成功举办!
2016年1月9日,由深圳市共创力企业管理咨询发起的"产品测试管理&敏捷项目管理"研讨会在深圳南山科技园创新谷咖啡成功举办!参加此次研讨会的企业有华为.中兴.烽火.腾讯.康 ...
- URAL - 1917 Titan Ruins: Deadly Accuracy(水题)
水题一个,代码挫了一下: 题意不好理解. 你去一个洞窟内探险,洞窟内有许多宝石,但都有魔法守护,你需要用魔法将它们打下来. 每个宝石都有自己的防御等级,当你的魔法超过它的防御等级时它就会被你打下来. ...
- Libgls 1.0.1 发布,OpenGL 立体渲染
Libgls 1.0.1 只是修复了一些小问题,更新了 FindGLS.cmake 脚本. Libgls 允许 OpenGL 立体渲染,不需要硬件支持四缓冲立体.支持许多立体显示模式,从立体眼镜的3D ...
- SQLite数据库在本地可以写,发布到服务器就不能写
用SQLite开发的一个Web Api,提供Json和Jsonp格式的数据,在本地使用vs2012开发并运行时,数据库的读写均正常. 但发布到Windows Server 2008 + IIS 7.5 ...
- 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。
之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...
- Twitter API升级至1.1
Twitter API 1.1是至今最大的一次升级,从3月份提出,到6月11日1.0版本已经全面停止调用.关于1.1版本升级特性可访问: https://dev.twitter.com/docs/ap ...