XML和json解析

来源:互联网 发布:域名那家继费便宜 编辑:程序博客网 时间:2024/04/28 01:41

DomTool.h

#import <Foundation/Foundation.h>#import "Student.h"@interface DomTool : NSObject-(void)startDom;@property(nonatomic,retain)NSMutableArray *stuArr;+(NSMutableArray *)startXMLDom;@end

DomTool.m

#import "DomTool.h"#import "GDataXMLNode.h"@implementation DomTool-(void)startDom{    // 先获取路径    NSString *path=[[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];    NSData *data=[NSData dataWithContentsOfFile:path];    //参数1:需要处理的数据    //参数2:没什么用,0就行    //参数3:错误信息    GDataXMLDocument *document=[[GDataXMLDocument alloc] initWithData:data options:0 error:nil];    //找到数据的根节点    GDataXMLElement *rootRlement=[document rootElement];    //找到所有的student的节点    NSArray *arr=[rootRlement elementsForName:@"student"];   //先对属性数组进行初始化    self.stuArr=[NSMutableArray array];    //遍历数组    for(NSInteger i = 0;i<arr.count;i++){        //创建一个学生对象        Student *stu=[[Student alloc] init];        //找到每一个student节点对应的内容        GDataXMLElement *stuElement=arr[i];        //根据节点名,对student节点里的内容进行获取        GDataXMLElement *name=[[stuElement elementsForName:@"name"] lastObject];        //对学生姓名进行赋值        stu.name=[name stringValue];        [self.stuArr addObject:stu];    }}//解析过程和之前加号方法一样+(NSMutableArray *)startXMLDom{    // 先获取路径    NSString *path=[[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];    NSData *data=[NSData dataWithContentsOfFile:path];    //参数1:需要处理的数据    //参数2:没什么用,0就行    //参数3:错误信息    GDataXMLDocument *document=[[GDataXMLDocument alloc] initWithData:data options:0 error:nil];    //找到数据的根节点    GDataXMLElement *rootRlement=[document rootElement];    //找到所有的student的节点    NSArray *arr=[rootRlement elementsForName:@"student"];    //先对属性数组进行初始化    NSMutableArray *stuArr=[NSMutableArray array];    //遍历数组    for(NSInteger i = 0;i<arr.count;i++){        //创建一个学生对象        Student *stu=[[Student alloc] init];        //找到每一个student节点对应的内容        GDataXMLElement *stuElement=arr[i];        //根据节点名,对student节点里的内容进行获取        GDataXMLElement *name=[[stuElement elementsForName:@"name"] lastObject];        //对学生姓名进行赋值        stu.name=[name stringValue];        [stuArr addObject:stu];    }    return stuArr;}

Student.h

#import <Foundation/Foundation.h>@interface Student : NSObject@property(nonatomic,copy)NSString *name;@property(nonatomic,copy)NSString *age;@property(nonatomic,copy)NSString *hobby;@property(nonatomic,copy)NSString *sex;@end

Student.m

#import "Student.h"@implementation Student-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}@end

ParserTool.h

#import <Foundation/Foundation.h>#import "Student.h"@interface ParserTool : NSObject<NSXMLParserDelegate>//先设置一个开始解析的方法-(void)startParser;//把处理好数据的学生,方放到数组里,然后直接使用数组就可以@property(nonatomic,retain)NSMutableArray *stuArr;@end

ParserTool.m

#import "ParserTool.h"@interface ParserTool ()//用来保存标签的内容@property(nonatomic,copy)NSString *tempStr;@end@implementation ParserTool-(void)startParser{    //先找到文件的路径    NSString *path=[[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];    //把路径对应的文件转换成NSData    NSData *data=[NSData dataWithContentsOfFile:path];    //创建一个xml的解析工具    NSXMLParser *parser=[[NSXMLParser alloc] initWithData:data];    //设置代理人    parser.delegate=self;    //开始解析    [parser parse];}#pragma mark 开始解析,执行协议方法-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{    //根据不同的节点名,进行不同的操作    if([elementName isEqualToString:@"Student"]){        self.stuArr=[NSMutableArray array];    }else if([elementName isEqualToString:@"student"]){        //如果是小写student创建一个学生对象        Student *stu=[[Student alloc] init];        [self.stuArr addObject:stu];    }}#pragma mark 通过这个协议方法能找到标签之间的内容,但是标签之间如果夹得还是标签,则没有内容-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{    //这个方法只要找到节点内容就会触发    self.tempStr=string;}#pragma mark 当节点结束的时候,会执行这个方法-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{    //先找到没有设置好的学生    Student *stu=[self.stuArr lastObject];//    if ([elementName isEqualToString:@"name"]) {//        stu.name=self.tempStr;//    }else if ([elementName isEqualToString:@"hobby"]){//        stu.hobby=self.tempStr;//    }else if ([elementName isEqualToString:@"age"]){//        stu.age=self.tempStr;//    }else if([elementName isEqualToString:@"sex"]){//        stu.sex=self.tempStr;//    }    //这个写法可以替代上面的if    [stu setValue:self.tempStr forKey:elementName];}

ViewController.m

#import "ViewController.h"#import "ParserTool.h"#import "Student.h"#import "DomTool.h"@interface ViewController ()- (IBAction)PerserAction:(id)sender;- (IBAction)DOMAction:(id)sender;- (IBAction)jsonserAction:(id)sender;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}- (IBAction)PerserAction:(id)sender {    ParserTool *tool=[[ParserTool alloc] init];    [tool startParser];    //遍历学生姓名    for (Student *stu in tool.stuArr) {        NSLog(@"%@",stu.name);    }}- (IBAction)DOMAction:(id)sender {//    DomTool *tool=[[DomTool alloc] init];//    [tool startDom];//    for (Student *stu in tool.stuArr) {//        NSLog(@"%@",stu.name);//    }    //加号方法    NSMutableArray *arr=[DomTool startXMLDom];    for (Student *stu in arr) {        NSLog(@"%@",stu.name);    }}- (IBAction)jsonserAction:(id)sender {    NSString *path=[[NSBundle mainBundle] pathForResource:@"movielist" ofType:@"test"];    NSData *data=[NSData dataWithContentsOfFile:path];    NSDictionary *dic=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];}@end
0 0
原创粉丝点击