XML 和 JSON 解析数据

本文介绍了XML和JSON两种数据解析方式的区别与实现方法,包括SAX解析与DOM解析,以及系统内置与第三方库的JSON解析。同时,还提供了XML与JSON解析的代码示例,帮助读者快速理解并应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于数据的解析方式有两种: XML 和 JSON 解析
下面来给大家简单介绍一下这两种解析方式 , 希望能帮到您!

XML解析方式

//这个系统的解析方式

- (IBAction)xmlParserWithSAX:(UIButton *)sender {
    //SAX解析的方式: 逐行解析, 效率比较低, 资源消耗比较小, 如果xml格式有误, 错误之前的可以解析
    //NSXMLParser, xml解析类(SAX), 继承于NSObject
    //文件路径
    NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Girl" ofType:@"xml"];
    //url
    NSURL *url = [NSURL fileURLWithPath:fielPath];
    //根据文件路径创建解析类
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    //整个解析过程, 可以再代理方法中查看
    parser.delegate = self;
    //开始解析
    [parser parse];
    //释放
    [parser release];    
}

解析过程需要在其代理方法中查看

#pragma mark - NSXMLParserDelegate

//已经开始解析文件
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"文件已经开始解析");
    //对数组初始化
    self.girlArray = [NSMutableArray arrayWithCapacity:3];

}
//文件已经结束解析
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"文件已经结束解析");
    for (Girl *girl in self.girlArray) {
        NSLog(@"%@", girl);
    }
}
//遇到开始标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    NSLog(@"遇到开始标签:%@", elementName);
    //遇到开始标签girl时创建girl
    if ([elementName isEqualToString:@"girl"]) {
        self.girl = [[Girl alloc] init];
    }

}
//遇到结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSLog(@"遇到结束标签:%@", elementName);
    if ([elementName isEqualToString:@"name"]) {
        self.girl.name = self.tempString;

    }else if ([elementName isEqualToString:@"age"]){
        self.girl.age = self.tempString;

     }else if ([elementName isEqualToString:@"height"]) {
         self.girl.height = self.tempString;
     }else if ([elementName isEqualToString:@"girl"]){
         [self.girlArray addObject:self.girl];
         [self.girl release];
     }
}
//发现字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"发现字符串:%@", string);
    self.tempString = string;
}
//解析出现错误
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"解析出现错误:%@", parseError);
}

针对XML还有一些第三方的解析方式

//DOM解析法
//注: 使用第三方类库, 一定要引入头文件, 才能使用, 需要该配置环境的要改一下
//如: #import “GDataXMLNode.h”

- (IBAction)xmlParserWithDOM:(UIButton *)sender {
    //DOM解析方式: 正整片读完, 再解析, 效率比较高, 资源消耗比较大, 如果xml有误, 就无法解析
    //谷歌提供的DOM解析类, GDataXMLNode

    //第三方类库的使用
    //1. 下载第三方类, code4app, github
    //2. 导入工程
    //3. 配置环境(可选的)
    //   a. 当前工程是ARC, 第三方类库是MRC, 需要单独配置第三方类库的环境, flag写成 - fno-objc-arc
    //   b. 当前工程是MRC, 第三方类库是ARC, 需要单独配置第三方类库的环境, flag写成 - fobjc-arc
    //4. 导入第三方使用的类库(可选的)
    //   比如GDataXMLNode需要导入libxml
    //5. 配置参数(可选的)
    //6. 引入头文件

    //文件路径
    NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Girl" ofType:@"xml"];
    //获取文件内容
    NSString *content = [[NSString alloc] initWithContentsOfFile:fielPath encoding:NSUTF8StringEncoding error:nil];
    //解析, 分析出xml文档的结构
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:content options:0 error:nil];

    //获取根节点 girls
    GDataXMLElement *rootElement = [document rootElement];
    NSLog(@"%@", rootElement);

    //查找girls节点下的子节点girl
    NSArray *girlElements = [rootElement elementsForName:@"girl"];

    //对节点数组进行遍历
    self.girlArray = [NSMutableArray arrayWithCapacity:3];

    for (GDataXMLElement *element in girlElements) {
//        NSArray *nameElement = [element elementsForName:@"name"];
//        GDataXMLElement *name = [nameElement firstObject];
//        NSLog(@"%@", [name stringValue]);
        NSString *name = [[[element elementsForName:@"name"] firstObject] stringValue];
        NSString *age = [[[element elementsForName:@"age"] firstObject] stringValue];
        NSString *height = [[[element elementsForName:@"height"] firstObject] stringValue];
        //NSLog(@"%@ %@ %@", name, age, height);

        Girl *girl = [[Girl alloc] init];
        girl.name = name;
        girl.age = age;
        girl.height = height;
        [self.girlArray addObject:girl];
        [girl release];
    }
    for (Girl *girl in self.girlArray) {
        NSLog(@"%@", girl);
    }

    //GDataXMLNode是支持XPath的
    //XPath: 路径检索

    // /代表绝对路径, //代表相对路径
    NSArray *elements = [rootElement nodesForXPath:@"girl/name" error:nil];

    for (GDataXMLElement *element in elements) {
        NSLog(@"%@", [element stringValue]);
    }

}

//下面来说一下JSON解析

//系统JSON的解析方法

- (IBAction)JSONparserWithSyetem:(UIButton *)sender {
//    NSJSONSerialization, json解析类, 继承与NSObject

    //文件路径
    NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Boy" ofType:@"json"];

    //从指定文件获取二进制数据
    NSData *data = [[NSData alloc] initWithContentsOfFile:fielPath];

    NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    //NSLog(@"%@", array);
    NSMutableArray *boyArray = [NSMutableArray arrayWithCapacity:0];
    for (NSDictionary *dic in array) {
        //1.
//        Boy *boy = [[Boy alloc] init];
//        boy.name = dic[@"name"];
//        boy.age = dic[@"age"];
//        boy.height = dic[@"height"];
//        [boyArray addObject:boy];
//        [boy release];
        //2.KVC赋值
//        Boy *boy = [[Boy alloc] init];
//        [boy setValuesForKeysWithDictionary:dic];
//        [boyArray addObject:boy];
//        [boy release];
        //
        Boy *boy = [[Boy alloc] initWithDictionary:dic];
        [boyArray addObject:boy];
        [boy release];

    }

    for (Boy *boy in boyArray) {
        NSLog(@"%@", boy);
    }


}

第三方的JSON解析方法
//注: 使用第三方类库, 一定要引入头文件, 才能使用, 需要该配置环境的要改一下
//如: #import “JSONKit.h”

- (IBAction)jsonparserWithThirdPart:(UIButton *)sender {
    //JOSNKit
    //1.
    //从指定文件获取字符串
    NSString *fielPath = [[NSBundle mainBundle] pathForResource:@"Boy" ofType:@"json"];

    //从指定文件获取内容
    NSString *content = [[NSString alloc] initWithContentsOfFile:fielPath encoding:NSUTF8StringEncoding error:nil];
    //使用JOSNKit解析json字符串
    NSArray *array = [content objectFromJSONString];
    //NSLog(@"%@", array);

    for (NSDictionary *dic in array) {
        Boy *boy = [[Boy alloc] initWithDictionary:dic];
        NSLog(@"%@", boy);
    }
    [content release];
    //2
    //从指定文件获取二进制数据
    NSData *data = [[NSData alloc] initWithContentsOfFile:fielPath];
    NSLog(@"---------第二种解析方法----------");
    //使用JSONKit解析json二进制数据
    NSArray *array1 = [data objectFromJSONData];
    for (NSDictionary *dic in array1) {
        Boy *boy = [[Boy alloc] initWithDictionary:dic];
        NSLog(@"%@", boy);
    }
    [data release];

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值