XML解析、Json解析

2 篇文章 0 订阅
2 篇文章 0 订阅

XML解析一般分为SAX和DOM.也就是事件和文档.
一.XML解析之SAX解析, 及NSXMLParser
SAX解析说白了就是事物模型解析, 从头开始读取文档, 读完头标签后, 理论上是读取标签值, 最后是结束标签
在ParserTool.h文件中

//  这个是系统提供给的xml的解析方法, 通过代理方法完成解析
@interface ParserTool : NSObject<NSXMLParserDelegate>
@property(nonatomic, retain)NSMutableArray *stuArr;
//  用来保存节点中间的字符串内容
@property(nonatomic, copy)NSString *tempStr;
//  开始解析的方法
- (void)startParser;

在Parser.m文件中

#pragma mark - Method startParser
- (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];
    [parser release];
}
#pragma mark  碰到开始的节点就会走这个方法(准备解析节点)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    NSLog(@"%@", elementName);
    if ([elementName isEqualToString:@"Student"]) {
        //  碰到根节点Student, 先把装对象的数组初始化
        self.stuArr = [NSMutableArray array];
    } else if ([elementName isEqualToString:@"student"]){
        //  碰到小写的student, 意味着一个新的学生, 需要创建一个新的对象来装学生的信息
        Student *stu = [[Student alloc] init];
        [self.stuArr addObject:stu];
        [stu release];
    }
}
#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 *student = [self.stuArr lastObject];
    //  给对象进行赋值(通过if进行判断)
//    if ([elementName isEqualToString:@"name"]) {
//        student.name = self.tempStr;
//    } else if ([elementName isEqualToString:@"sex"]){
//        student.sex = self.tempStr;
//    } else if ([elementName isEqualToString:@"age"]){
//        student.age = self.tempStr;
//    } else {
//        student.hobby = self.tempStr;
//    }
    //  等同于上面的四句话, 结果是一样的
    [student setValue:self.tempStr forKey:elementName];
}
//  这种事系统提供的解析方法, 逐行代理的方法逐行解析数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值