iOS-Senior6-数据解析(XML)

1.解析的基本概念

定义:从事先规定好的格式中提取数据

解析前提:提前约定好格式,数据提供方按照格式提供数据,数据获取方则按照格式获取数据

iOS开发常见的解析:XML解析,JSON解析

2.XML数据结构

XML:可扩展标记语言,主流数据格式之一,可以用来存储和传输数据。

功能:数据交换,内容管理,用作配置文件

语法:

1.声明

2.节点使用一对标签表示:起始和结束标签

3.根节点是起始节点,只有一个,节点可以嵌套

4.节点可以有值,存储在一对儿标签中

实例:

3.进行XML解析时使用到的SAX文件


SAX:Simple API for XML.基于事件驱动的解析方式,逐行解析数据(采用协调回调机制)

1.NSXMLParser是iOS自带的xml解析类,采用SAX方式解析数据

2.解析过程由NSXMLParserDelegate协议方法回调

3.解析过程:开始标签 ->取值 ->结束标签 ->取值

源代码:

系统SAX解析:(结果使用一个数组存储,里面包含每个字典)

//1.获取文件路径

NSString *filePath = [[NSBundle mainBundle] pathForResource@"Studentlnfor_xml" ofType:@"txt"];

//2.获取出NSData类型的数据

NSData *data = [NSData dataWithContentsOfFile:filePath];

NSLog(@"data = %@",data);

//3.设置SAX文件,并关联相关的xml文件

NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];

//4.设置代理

parser.delegate = self;

//5.开始解析

[parser parser];

#pragma mark - NSXMLParserDelegate协议方法

//1.开始文档解析

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

//在这个方法里初始化数组(也可以懒加载)

 self.dataArray = [NSMutableArray array];

}

//2.开始解析标签

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

//根据需求需要的标签去获取相关的数据

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

      Student *stu = [[Student alloc] init];

 //在这里不需要赋值操作,将数据对象添加到数组中

      [self.dataArray addObject:stu];

      NSLog(@"%@",self.dataArray);

   }

//将当前的标签值传给刚才声明的一个属性

       self.currentElement = elementName;

}

#pragma mark - 3.解析标签中的内容然后赋值给对象

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

//从数组中取出相关的student对象,每次从数组中取出最后一个元素,保证每次取出最新的对象内容

       Student *stu = [self.dataArray lastObject];

//kvc赋值

       [stu setValue:string forKey:self.currentElement];

}

#pragma mark - 4.结束标签

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

         self.currentElement = nil;

}

#pragma mark - 5.结束文档解析

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

//取出数组校验

for(Student *student in self.dataArray) {

     NSLog(@"name = %@,gender = %@,age = %ld,hobby = %@",student.name,student.gender,student.age,student.hobby);

     }

}

#pragma mark - 6.错误处理

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {

        NSLog(@"出错了:error = %@",parseError);

}

//第二种方法:使用DOM解析

//使用第三方:GDataXMLNode(谷歌)

1.需要引入一个动态库(libxml2.tbd)

2.获取文件路径(同上)

3.获取data数据(同上)

//4.初始化存储数据的数组

self.dataArray = [NSMutableArray array];

//5.设置dom解析(创建解析文档)

GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

//6.获取根节点(文档为根节点)

GDataXMLElement  *rootElement = document.rootElement;

//7.变量获取相对应的子节点(studens是子节点,文档才是父节点)

  for(GDataXMLElement *studentElement in rootElement.children) {

     Student *student = [[Student alloc]init];

          for(GDataXMLElement *stuElement in   studentElement.children) {

      [stu setVslue:stuElement.stringValue forKey:stuElement];

    }

      [self.dataArray addObject:stu];

//循环显示

    for(Student *student in self.dataArray) {

   NSLog(@"name = %@,gender = %@,age = %ld,hobby = %@",student.name,student.gender,student.age,student.hobby);

 }

}

3.使用DOM解析

(1)设置Build Settings 里的Header Search Paths 添加 /user/include/libxml2

设置Build Settings里的Other Linker Flags 添加-lxml2

(2)设置Build Phases 里的GDataXMLNode,添加 -fno-objc - arc

 

原文地址:https://www.cnblogs.com/zhoulina/p/5486958.html