美文网首页
XML文档解析

XML文档解析

作者: 随风飘荡的小逗逼 | 来源:发表于2016-09-28 11:56 被阅读5次

    第一种解析方式:SAX

    因为这种解析方式是采用协议回调机制,逐行解析,所以苹果提供了一个类,这个类中封装了解析的整个过程,可以通过调用这个类中声明的协议方法来实现SAX解析的每个步骤。

    第一步:获取需要解析文件的路径,用这个路径,初始化一个NSData或者NSURL对象,并用初始化好的对象创建一个解析NSXMLParser对象,同时设置执行协议的代理,设置好代理后用“parser”方法开始解析,这样才能按照逻辑执行协议中的方法,进行:开始标签——>取值并赋值——>结束标签——>取值。

    - (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);

    }

    相关文章

      网友评论

          本文标题:XML文档解析

          本文链接:https://www.haomeiwen.com/subject/nnwcyttx.html