IOS学的容易--XML的SAX解析

本文深入探讨了XML与JSON数据解析技术,包括SAX解析、DOM解析及JSON数据结构的理解与应用。重点阐述了如何利用NSXMLParser进行XML文件解析,以及如何通过GDataXmlNode实现DOM解析,同时介绍了JSON数据解析方法。文章还提供了实例代码,展示了如何将解析后的数据封装到自定义模型中,并存储到数组中备用。

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

//XMLSAX解析
// NSXMLParser 分析XML文件
- (
void)setUpDataXMLParser
{
   
    // 3. 创建路径
   
NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"];
   
   
// 2. NSData存储数据,以二进制形式存储
   
NSData *data = [NSDatadataWithContentsOfFile:path];
   
   
// 1. 创建一个分析人
   
NSXMLParser *parser = [[NSXMLParseralloc]initWithData:data];
   
   
// 设置代理
    parser.
delegate = self;
   
   
// 开始分析(利用协议方法,进行分析,去遵守协议NSXMLParserDelegate)
    [parser
parse];
   
   
// 释放分析人
    [parser
release];
   
   
NSLog(@"我在这里释放行吗?");
}

/**
 * 
执行顺序:
    1.
开始分析: [parser parse];
 //
开始代理方法的实现
    1.
开始分析文件
    2.
开始遇到节点
    3.
发现字符
    4.
结束遇到节点
    5.
结束分析文件
 */


/***************************************************************/

/**
 *
XML数据保存到model需要的操作
 1.
把数据取出来
 2.
装进model
 3.
model装进数组,备用
 
 
 1.
从什么位置初始化数组:开始分析文件位置
 2.
从什么位置初始化model:开始遇到节点
    //
从什么位置可以拿出数据: 4.发现字符
 3.
从什么位置给model赋值:   5.结束节点
 
4. 从什么位置可以打印出数组已经结束分析文件(最后执行)
 
 */

#pragma mark - NSXMLParser代理方法
// 1. 已经开始分析文件 (最先执行),这个方法值只走一次
// 在这个方法里面初始化数组
- (
void)parserDidStartDocument:(NSXMLParser*)parser
{
   
// 初始化数组
   
self.dataArray= [NSMutableArrayarray];
   
   
NSLog(@"已经开始分析文件");
}

// 2. 已经结束分析文件 (最后执行)
//
- (
void)parserDidEndDocument:(NSXMLParser*)parser
{
   
NSLog(@"已经结束分析文件");
   
   
NSLog(@"%@",self.dataArray);
}


// 3. 开始遇到节点
// 初始化model
- (
void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName attributes:(NSDictionary*)attributeDict
{
    // 初始化model
    // Student 是内层的节点, // self.model 这个model是在本类中声明的
    if ([elementName isEqualToString:@"Student"]) {
       
self.model= [[StudentModelalloc]init];
    }
   
   
//NSLog(@"开始遇到节点");
   
NSLog(@"<%@>", elementName);//节点名字
}

// 4. 发现字符, 逐行发现
// 拿出数据
- (
void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string
{
    // 保存字符串 , self.string也是被类声明的 nsstring类型的
    self.string= string;// string就是<></>之间的内容
   
//    NSLog(@"发现字符");
   
NSLog(@"string: %@", string);
}

// 5. 结束节点
// model赋值
- (
void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName
{
   
   
// model赋值
   
if ([elementNameisEqualToString:@"name"]) {//如果节点的名字等于
       
self.model.name=self.string;
    }
else if ([elementName isEqualToString:@"gender"]) {
       
self.model.gender=self.string;
    }
else if ([elementName isEqualToString:@"age"]) {
       
self.model.age=self.string;
    }
else if ([elementName isEqualToString:@"motto"]) {
       
self.model.motto=self.string;
    }
else if ([elementName isEqualToString:@"Student"]) {
       
// 节点等于Student的时候一个model就赋值完成了,可以装进数组了
        [
self.dataArrayaddObject:self.model];
       
        [
_model release]; //装进数组后就可以释放了
    }
   
   
//NSLog(@"遇到节点结束触发");
   
NSLog(@"</%@>", elementName);


/******************** Dom解析 一次性解析完成 **************************/
// Dom解析
// 使用 GDataXmlNode这个类库来实现(第三方类库, 谷歌写的类库)
// 直接导入类库报错
// 报错原因: GDataXmlNode 基于 libxml来写的,所以必须把libxml框架导入工程里面
- (
void)setUpDataGDataXmlNode
{
   
// 创建路径
   
NSString *path = [[NSBundlemainBundle]pathForResource:@"Student"ofType:@"xml"];
   
// 转换成NSData
   
NSData *data =[NSDatadataWithContentsOfFile:path];
   
// 利用XMLNode类进行Dom解析
   
// data初始化管理文件的对象,转化成树形结构
   
// <#(NSError **)#> 如果解析失败可以打印出理由, 需要传入&error
   
   
NSError *error =nil;
   
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:dataoptions:0error:&error];
   
   
// 2. 获取根节点
   
GDataXMLElement *rootElement = [document rootElement];
   
//NSLog(@"%@", rootElement);
   
    // 3. 获取根节点下Student节点(Student 下面有好多Student节点, 获取气候放到数组里面)
    NSArray *stusArray = [rootElement elementsForName:@"Student"];
   
//NSLog(@"%@", stusArray);
   
   
   
// 循环外面初始化一下数组 用来保存model
   
self.dataArray= [NSMutableArrayarray];
   
   
// 遍历Student节点的数组
   
for (inti =0; i < stusArray.count; i++) {
       
// 取出每一个Student节点
       
GDataXMLElement *oneStudentElement = stusArray[i];
//       
//        // 取出oneStudentElement节点下的name的数组(这个数组里面存放的是节点,数据类型是GDataXMLElement类型)
//        NSArray *nameArray = [oneStudentElement elementsForName:@"name"];
//        NSLog(@"nameArray: %@", nameArray);
//       
//        // 取出name节点,
//        GDataXMLElement *nameElement = [nameArray firstObject]; //0个元素
//       
//        // 转化为字符串
//        NSString *name = [nameElement stringValue];
//        NSLog(@"name: %@", name);
//       
//       
//       
//        // 取出oneStudentElement节点下的gender的数组
//        NSArray *genderArray = [oneStudentElement elementsForName:@"gender"];
//        // 取出gender节点
//        GDataXMLElement *genderElement = genderArray[0];
//        // 转化为字符串
//        NSString *gender = [genderElement stringValue];
//        NSLog(@"gender: %@", gender);
//       
//       
//        NSArray *ageArray = [oneStudentElement elementsForName:@"age"];
//        GDataXMLElement *ageElement = ageArray[0];
//        NSString *age = [ageElement stringValue];
//       
//        NSArray *mottoArray = [oneStudentElement elementsForName:@"motto"];
//        GDataXMLElement *mottoElement = [mottoArray firstObject];
//        NSString *motton = [mottoElement stringValue];
//   
       
// 三次次调用封装的方法 
        NSString*name = [selfbackStringWithElement:oneStudentElementelementName:@"name"];
       
NSString *gender = [self backStringWithElement:oneStudentElement elementName:@"gender"];
       
NSString *age = [self backStringWithElement:oneStudentElement elementName:@"age"];
       
NSString *motto = [self backStringWithElement:oneStudentElement elementName:@"motto"];
   
       
// model赋值
       
// 初始化model
       
StudentModel *model = [[StudentModel alloc] init];
        model.
name = name;
        model.
gender = gender;
        model.
age = age;
        model.
motto = motto;
       
       
// model装进数组
        [
self.dataArrayaddObject:model];
        [model
release];
       
    }
}


// 封装的方法 返回节点中的字符串
- (
NSString *)backStringWithElement:(GDataXMLElement*)element elementName:(NSString*)elementName
{
   
// 取出oneStudentElement节点下的name的数组
   
NSArray *nameArray = [elementelementsForName:elementName];
   
NSLog(@"nameArray: %@", nameArray);
   
   
// 取出name节点
   
GDataXMLElement *nameElement = [nameArray firstObject];//0个元素
   
   
// 转化为字符串
   
NSString *name = [nameElementstringValue];
  
   
return name;
   
}

/*********** Dom解析结束  *************************/







JSON 数据结构, 99%的公司都在用, 用系统再带的json解析, 不要用jsionkit

    

// JSON 解析数据 上面的教师的数据
- (
void)setUpJson
{
   
// 获取路径
   
NSString *path = [[NSBundlemainBundle]pathForResource:@"Teacher"ofType:@"json"];
   
// 变成dada
   
NSData *data = [NSDatadataWithContentsOfFile:path];
   
   
// data转化成可变数组或者可变字典(是字典还是数组,要看json最外层是什么)
   
   
// NSJSONSerialization json使用的类
   
NSError *error =nil;
   
NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error];
   
//NSLog(@"%@", dataArray);
   
   
self.dataArray= [NSMutableArrayarray];
   
// ��香蕉
   
for (NSDictionary*dicin dataArray) {
       
TeacherModel *model = [[TeacherModel alloc] init];
        [model
setValuesForKeysWithDictionary:dic];
        [
self.dataArrayaddObject:model];
        [model
release];
    }
   
NSLog(@"%@",self.dataArray);
   
   
}
[]

// json解析城市数据
- (
void)setUpDataJsonCity
{
   
NSString *path = [[NSBundlemainBundle]pathForResource:@"area"ofType:@"json"];
   
NSData *data = [NSDatadataWithContentsOfFile:path];
   
   
NSError *error =nil;
   
// data转化成可变字典或数组,因为城市数据最外层是数组,所以用
   
NSMutableArray *dataArray = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:&error];
   
self.dataArray= [NSMutableArrayarray];
   
   
/*******  JSONKIT 解析  *********/
   
// 导入第三方类库
   
//NSMutableArray *jsonKitArray = [data objectFromJSONData]; //等价于 上面的   NSJSONSerialization解析
   
/********        ************/
   
   
   
   
// 剥香蕉
   
// 遍历数组, 因为数组里面的元素类型是NSDictionary类型,所以遍历的时候是(NSDictionary *dic in dataArray)
   
for (NSDictionary*dicin dataArray) {
       
CityModel *model = [[CityModel alloc] init];//构建model
        [model
setValuesForKeysWithDictionary:dic];//model进行KVC赋值,把字典装进model
        [
self.dataArrayaddObject:model];//model装进数组
    }
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值