首页 > 其他 > 详细

XML解析方式的回顾

时间:2016-01-04 22:30:45      阅读:191      评论:0      收藏:0      [点我收藏+]

最近因为项目中需要XML数据的解析方式所以在这里对XML数据解析方式进行了一些复习和总结。

以学生对象为例来说明吧

首先先在UITableViewController的子类里引入头文件,并创建学生对象来存储信息,同时创建一个可变数组来存储学生对象

#import "SAXViewController.h"

#import "Student.h"

@interface SAXViewController ()

@property (nonatomic,retainNSMutableArray *students;//存储学生信息

@property (nonatomic,retainStudent *stu;//存储一个学生对象

在解析数据的时候需要创建一个字符串属性来存储数据

@property (nonatomic,copyNSString *content;//存储标签之间的数据

@end

 

@implementation SAXViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

在加载视图方法中添加解析按钮并为按钮添加点击事件,触发解析过程

    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc]initWithTitle:@"解析" style:UIBarButtonItemStylePlain target:self action:@selector(handleSAXParse:)]autorelease];

}

- (void)handleSAXParse: (UIBarButtonItem *)sender {

以下我讲分步骤阐述:

    //1:获取XML数据的文件路径

    NSString *filePath = [[NSBundle mainBundlepathForResource:@"Student" ofType:@"xml"];

    //2:jXML数据转换成二进制数据流NSData

    NSData *data = [NSData dataWithContentsOfFile:filePath];

    //3:创建一个XML数据的解析器

    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];

    //4:设置代理

    parser.delegate = self;

    //5:启动解析器

    [parser parse];

    //6释放空间

    [parser release];    

}

XML数据解析方式的代理方法有五个,下面我分别说明这五个方法实现的时机和内容

//当整个解析过程开始的时候调用

- (void)parserDidStartDocument:(NSXMLParser *)parser {

    [self.students removeAllObjects];

}

 

//当解析过程中发现开始标签的时候调用

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

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

        //创建学生对象

       self.stu = [[[Student alloc]init]autorelease];

        self.stu.position = attributeDict[@"position"];

    }

}

 

//发现标签之间存储的数据的时候调用

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    self.content = string;//存储标签之间的数据

}

//当发现结束标签的时候调用

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

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

        self.stu.name = self.content;

    }else if ([elementName isEqualToString:@"gender"]) {

        self.stu.gender = self.content;

    }else if ([elementName isEqualToString:@"age"]) {

        self.stu.age = self.content;

    }else if ([elementName isEqualToString:@"motto"]) {

        self.stu.motto = self.content;

    }else if ([elementName isEqualToString:@"Student"]) {

        [self.students addObject:self.stu];

    }

}

//当整个解析过程结束的时候调用

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

     //刷新数据

    [self.tableView reloadData];

}

到此整个XML解析过程结束,下面只需要将存储的学生信息添加到相应的UITableViewCell即可。

以上只是系统内置的SAX解析,逐行解析,解析效率低。

另一种DOM解析是一次性全部读入内存,效率比较高

DOM解析又分为根节点解析和叶子节点解析

根节点解析需要获取根节点,然后获取根节点的叶子节点,如果获取的叶子节点也有叶子节点,再通过for循环来获取每一层下得所有叶子节点。

叶子节点解析只需要使用相对路径查找所有的叶子节点,然后通过循环方式获取相应属性的节点。

 

XML解析方式的回顾

原文:http://www.cnblogs.com/weiyingxu/p/5100407.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!