加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML和JSON数据解析

发布时间:2020-12-16 08:56:09 所属栏目:百科 来源:网络整理
导读:数据解析有两种 1.XML 2.JSON 先来介绍XML XML有两种解析格式 ①SAX方式解析 ②DOM方式解析 sax方式为逐行解析,dom方式是一下全部加载到内存 1.sax需要设置代理, 2.还需要创建数据解析工具对象NSXMLParser, 3.实现代理中的方法。 4.最后要开启解析。 在开

数据解析有两种
1.XML
2.JSON

先来介绍XML
XML有两种解析格式
①SAX方式解析
②DOM方式解析

sax方式为逐行解析,dom方式是一下全部加载到内存
1.sax需要设置代理,
2.还需要创建数据解析工具对象NSXMLParser,
3.实现代理中的方法。
4.最后要开启解析。

在开始解析标签中提取数据。

dom方式解析数据
不用设置代理
但需要用GDataXMLDocumnt对象来接受数据,用GDataSMLElement来获取跟节点。
需要对GDataXMLDocumnt,GDataSMLElement的属性有一定的了解。

DOM方式解析

1.读取路径
2.用NSData来接受数据
3.用NSJSONSerialization来解析数据。

#import "ViewController.h"
#import "Student.h"
#import "GDataXMLNode.h"
#import "Teacher.h"
#import "JSONKit.h"

@interface ViewController ()

{
    NSString *_currentElementName;//用来临时接受“开始标签”的名字
}

@property(nonatomic,retain)NSMutableArray * studentsArray;//存放所有对象

@property(nonatomic,retain)NSMutableArray * teachersArray;//存放所有老师对象


- (IBAction)didclickSAX:(UIButton *)sender;

- (IBAction)didClickDOM:(UIButton *)sender;

- (IBAction)didClickJSON:(UIButton *)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.
}


#pragma mark ===========使用SAX方式解析XML格式的数据(采用的是协议回调机制,来逐行解析数据,使用的系统提供的工具类:NSXMLParser)
- (IBAction)didclickSAX:(UIButton *)sender {

    //获取文件路径
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Students" ofType:nil];

    //2.根据文件路径来获取文件中的数据,并将其转换为NSData,

    NSData *date = [NSData dataWithContentsOfFile:filePath];

    //3.解析数据

        //①.创建解析数据的工具对象
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:date];


    //②设置代理
    parser.delegate = self;

    //③开启解析

    [parser parse];

}


#pragma mark --------------实现NSXMLParserDelegate协议中的方法


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


    self.studentsArray = [NSMutableArray array];
}
// sent when the parser begins parsing of the document.

//2.结束解析文件
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"结束解析文件");

    for (Student *stu in _studentsArray) {
        NSLog(@"%@,%@,%@",stu.name,stu.number,stu.address);
    }

    // NSLog(@"%s",__FUNCTION__);
}


//3.解析开始标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    //用来存储每次读取到的标签名,供其他方法使用
    _currentElementName = elementName;

    NSLog(@"开始解析标签:%@",elementName);

    if ([elementName isEqualToString:@"student"]) {
        Student *stu = [[Student alloc]init];
        [_studentsArray addObject:stu];

        [stu release];
    }
}

//4.解析结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"结束解析标签%@",elementName);
// NSLog(@"%s",__FUNCTION__);
    //为了防止读取完结束标签,给原来的属性名_currentElementName 的值又赋值为空了
    _currentElementName = nil;
}

//5.去标签后的值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    //取出最新添加到数组中的那个student对象
    Student *stu = [_studentsArray lastObject];

    [stu setValue:string forKey:_currentElementName];

    NSLog(@"取出的值%@",string);
// NSLog(@"%s",__FUNCTION__);
}
// This returns the string of the characters encountered thus far. You may not necessarily get the longest character run. The parser reserves the right to hand these to the delegate as potentially many calls in a row to -parser:foundCharacters:

// sent when the parser has completed parsing. If this is encountered,the parse was successful.

#pragma MARK ---------使用DOM方式解析XML格式数据(会将整个xml文件读入内存,是以树状的结构存放在内存中),每一个节点都会对应一个数组,存放这个节点的所有,最终我们存取的是叶子节点
- (IBAction)didClickDOM:(UIButton *)sender {
    //1 获取xml文件路径

    NSString *filepath = [[NSBundle mainBundle]pathForResource:@"Students" ofType:nil];

    //2 根据路径获取文件,将其数据装换为NSdate类型

    NSData *data = [NSData dataWithContentsOfFile:filepath];


    //3.解析

    NSError *error = nil;

    //①创建解析数据的工具对象,当创建并初始化完工具类对象之后,会将整个data数据读入内存,存在工具类对象里(xmlDocument)
    GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc]initWithData:data options:0 error:&error];
    //获取根节点

    GDataXMLElement * rootElement = xmlDocument.rootElement;
    //给学生数组开辟空间
    _studentsArray = [NSMutableArray array];

    for (GDataXMLElement * stuElment in rootElement.children) {

        //根节点中有几个子节点,就会相应的创建几个学生对象

        Student *stu = [[Student alloc]init];

        for (GDataXMLElement *element in stuElment.children) {
            //获取叶子节点中的值
            NSLog(@"%@",element.stringValue);
            //获取标签名
            NSLog(@"%@",element.name);

            [stu setValue:element.stringValue forKey:element.name];
        }

        [_studentsArray addObject:stu];
        [stu release];

    }

    for (Student *stu in _studentsArray) {
        NSLog(@"------%@,stu.address);
    }

#warning mark -----------获取所有name节点的值

    NSError *err = [NSError errorWithDomain:@"meiyou" code:5 userInfo:nil];

    NSArray *nodesArray = [xmlDocument nodesForXPath:@"//name" error:nil];
    NSArray *nodesArray1 = [xmlDocument nodesForXPath:@"//number" error:nil];
    NSArray *nodesArray2  = [xmlDocument nodesForXPath:@"//address" error:nil];
    for (GDataXMLElement *element in nodesArray2) {
// NSLog(@"%@",element.stringValue);
        NSLog(@"%@",element.stringValue);
    }

}


#pragma mark ===========解析JSON格式的数据(NSJSONSerialization和JSONKit方式)
- (IBAction)didClickJSON:(UIButton *)sender {
    //第一种方式:NSJSONSerialization

    //1.读取路径
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Teachers" ofType:nil];
    //2.读取文件,将其转化为NSDate
    NSData *data = [NSData dataWithContentsOfFile:filePath];

    //3.解析
    //第二个参数是枚举值, NSJSONReadingMutableContainers 表示返回值(字典,数组)是可变的,
    //NSJSONReadingMutableLeaves 表示叶子节点是可变的,几乎不用,
    //NSJSONReadingAllowFragments 表示除了当前这个方法能解析文件中包含数组和字典文件中之外,还可以解析文件中包含的其他类型。(默认是只能解析包含字典和数组的文件)
    NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];


    self.teachersArray = [NSMutableArray array];
    NSLog(@"=-=-=-%@",array);
    //遍历数组
    for (NSDictionary * dict in array) {
        //数组中有几个字典,表示我要创建几个Teacher对象

        Teacher *teacher = [[Teacher alloc]init];

        [teacher setValuesForKeysWithDictionary:dict];

        [_teachersArray addObject:teacher];
        [teacher release];
    }

    for (Teacher *teacher in _teachersArray) {
        NSLog(@"%@",teacher);
    }

#warning mark----------------JSON解析(使用JSONKit)

    NSMutableArray * array1 = [data objectFromJSONData];
    //遍历数组

    //创建对象

#pragma mark ------
    NSDictionary *dic = @{@"key":@[@"A",@"B",@"C"]};


    //将字典转化为NSData类型的数据
    NSData *date1 = [dic JSONData];


    //将字典转化为NSString类型的数据
    NSString * dicStr = [dic JSONString];

    NSLog(@"%@",date1);
    NSLog(@"%@",dicStr);

}
@end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读