• XML解析


    #import "ViewController.h"

    #import "Student.h"//首先需要新建一个模型,继承自NSObject的类 Student;

    @interface ViewController ()<NSXMLParserDelegate> 

    //声明变量

    @property (nonatomic, strong) NSMutableArray *studentArray;

    @property (nonatomic, strong) NSString *string;

    @property (nonatomic, strong) Student *student; 

    @end 

    @implementation ViewController

    //storyboard建立的模板,创建了一个button按钮,点击即可解析;saxBt是按钮的点击事件

    - (IBAction)saxBt:(UIButton *)sender { 

        NSString *string = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];

        //字符创转换格式为url

        NSURL *url = [[NSURL alloc] initFileURLWithPath:string];

        //创建解析类NSXMLParser

        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];

       //接受解析类的代理   

        parser.delegate = self;

        //开始解析

        [parser parse];    

    #pragma mark ---- 解析数据的方法------<NSXMLParserDelegate>

    - (void)parserDidStartDocument:(NSXMLParser *)parser{

        NSLog(@"开始解析");

    //初始化可变数组,以便存放模型

        self.studentArray = [NSMutableArray arrayWithCapacity:0];

    }

    - (void)parserDidEndDocument:(NSXMLParser *)parser{

        NSLog(@"结束解析"); 

    //解析完成打印解析好的放在可变数组内部的模型数据 

        for (Student *student in self.studentArray) {

            NSLog(@"%@",student); //模型内部 .m 文件需要重写(- (NSString *)description;)这个方法

            }

    }

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{

        NSLog(@"遇到开始标签:%@",elementName);

        if ([elementName isEqualToString:@"Student"]) {

            self.student = [[Student alloc] init];

        }

    }

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{

         NSLog(@"遇到结束标签:%@",elementName);

        if ([elementName isEqualToString:@"name"]) {

            self.student.name = self.string;

        }else if ([elementName isEqualToString:@"age"]){

            self.student.age = self.string;

        }else if ([elementName isEqualToString:@"gender"]){

            self.student.gender = self.string;

        }else if ([elementName isEqualToString:@"Student"]){

            [self.studentArray addObject:self.student];

        }

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

        NSLog(@"遇到数据内部的内容:%@",string);

        self.string = string;

    }

    此解析方法速度慢,特点是逐行解析,但是优点数据内部如果有错误,错误之前的数据一样可以解析出来;这个NSXMLParser 类是有自己的方法,使用时需要接受协议并且指定代理对象

    //XML的数据类型如下

    <Students>

        <Student>

            <name>张三</name>

            <age>18</age>

            <gender>男</gender>

        </Student>

        <Student>

            <name>王五</name>

            <age>22</age>

            <gender>男</gender>

        </Student>

        <Student>

            <name>小花</name>

            <age>18</age>

            <gender>女</gender>

        </Student>

        <Student>

            <name>六六</name>

            <age>22</age>

            <gender>女</gender>

        </Student>

    </Students>

  • 相关阅读:
    C# 之 HttpRequest 类
    C# 之 日常问题积累(一)
    DataGrid前台数据绑定技巧
    [转]C,C++开源项目中的100个Bugs
    10行Python代码解决约瑟夫环(模拟)
    基于ASP.NET的comet简单实现 http长连接,IAsyncResult
    架构设计分享之权限系统(看图说话)
    内核request_mem_region 和 ioremap的理解
    【调侃】IOC前世今生 工厂模式 反射 依赖倒置
    ecos内核概览--bakayi译
  • 原文地址:https://www.cnblogs.com/jiurong001/p/5195091.html
Copyright © 2020-2023  润新知