数据解析 XML JSON


/**

* 解析:按规定的格式提取数据的过程. 后台人员按照约定好的格式存入数据,前端开发人员按照约定好的格式读取数据.

*/

//主流的两大数据格式:XML JSON

/**XML解析两种工作原理:

SAX解析:基于事件回调机制.逐行读取进行解析.效率低.适合大数据解析.使用系统提供的类NSXMLParser

DOM解析:把解析数据读入内存,初始化为树形结构.逐层解析,效率较高,适合小数据解析.使用谷歌提供的第三方GDataXMLNode.

*/

XML :

SAX:

@interfaceSAXViewController()<NSXMLParserDelegate>

@property(nonatomic,strong)NSMutableArray*dataSource;

//存储节点名称

@property(nonatomic,copy)NSString*elementName;

@end

@implementationSAXViewController

- (IBAction)handleParse:(id)sender {

//获取本地文件

NSString*file = [[NSBundlemainBundle]pathForResource:@"Students"ofType:@"xml"];

//使用系统提供的NSXMLParser类解析(SAX)

//1.创建一个解析工具对象

NSData*data = [NSDatadataWithContentsOfFile:file];

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

//2.设置代理

parser.delegate=self;

//3.开始解析

[parserparse];

}

#pragma mark - NSXMLParserDelegate

//开始解析时

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

//创建数组

self.dataSource= [NSMutableArrayarray];

}

//开始读取起始标签

/**

* @param parser 解析工具对象

* @param elementName 标签的名称

* @param namespaceURI 命名空间

* @param qName 限定名称(通常和命名空间结合使用)

* @param attributeDict 标签的属性字典

*/

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

NSLog(@"起始标签:%@",elementName);

//获取开始标签名称

self.elementName= elementName;

//当起始标签名为Student时 创建学生对象

if([elementNameisEqualToString:@"Student"]) {

//创建Student对象

Student*stu = [[Studentalloc]init];

//存储到数据源数组中

[self.dataSourceaddObject:stu];

}

}

//获取开始标签和结束标签之间的值

//string 就是标签的值.

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

NSLog(@"%@",string);

//取出model

Student*stu = [self.dataSourcelastObject];

//赋值给stu;

[stusetValue:stringforKey:self.elementName];

}

//开始读取结束标签

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

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

//防止重新给elementName赋值;

self.elementName=nil;

}

//结束读取

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

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

}

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

NSLog(@"ERROR:%@",parseError);

}

DOM:

/**

* DOM解析:会将内容全部读入内存,把数据读成一个树形结构,按树形结构的层级读取内容.

GDataXMLNode:实在C语言的libxml2动态链接库基础上封装的OC的XML解析类.解析效率相对SAX高(快将近10倍)

使用 GDataXMLNode步骤:

1. target ->Build Phase ->LinkBinary添加libxml2.tbd

2.target -> Build Setting --HeaderSearch Path添加 /usr/include/libxml2;

*/

//DOM解析

- (IBAction)handleDom:(id)sender {

self.dataSource= [NSMutableArrayarray];

//获取xml文件路径

NSString*file = [[NSBundlemainBundle]pathForResource:@"Students"ofType:@"xml"];

//1.将解析内容写入GDataXMLDocument文档中

NSString*xmlStr = [NSStringstringWithContentsOfFile:fileencoding:NSUTF8StringEncodingerror:nil];

GDataXMLDocument*docment = [[GDataXMLDocumentalloc]initWithXMLString:xmlStroptions:0error:nil];

//2.获取节点

//获取根节点

GDataXMLElement*rootElement = [docmentrootElement];

//获取GDataXMLDocument对象中的根节点,再根据根节点获取下面的所有子节点

NSArray*childEles =rootElement.children;

//遍历子节点数组

for(GDataXMLElement*childElementinchildEles) {

// NSLog(@"%@",childElement);

//创建学生对象

Student*stu = [[Studentalloc]init];

//遍历当前节点的所有子节点.

//subElement.name:获取节点名称

//subElement.stringValue:获取节点对应的值.

for(GDataXMLElement*subElementinchildElement.children) {

[stusetValue:subElement.stringValueforKey:subElement.name];

}

//存储到数据源

[_dataSourceaddObject:stu];

}

NSLog(@"%@",_dataSource);

}

JSON:

//使用系统提供的类

- (IBAction)handleSystem:(id)sender {

self.dataSource=nil;

//获取json文件路径

NSString*file = [[NSBundlemainBundle]pathForResource:@"Model"ofType:@"geojson"];

//根据文件路径初始化NSData对象

NSData*data = [NSDatadataWithContentsOfFile:file];

//系统类的解析

/**

返回值的类型取决于json数据最外层的类型

* @param NSJSONReadingOptions

NSJSONReadingMutableContainers :如果最外层的容器类型(字典或数组),该选项可以获取可变的类型

NSJSONReadingMutableLeaves:如果json中数据中子节点的值是字符串,就把该字符串转为可变的.

NSJSONReadingAllowFragments:不可变的(通常使用).

*

*/

NSDictionary*dic = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingAllowFragmentserror:nil];

NSLog(@"%@",dic);

//处理数据

NSArray*arr = dic[@"data"];

for(NSDictionary*dicinarr) {

Activity*model = [[Activityalloc]init];

//KVC赋值

[modelsetValuesForKeysWithDictionary:dic];

//存储到数组中

[self.dataSourceaddObject:model];

}

[self.tableViewreloadData];

}

- (IBAction)handleOther:(id)sender {

//使用第三方类:(看附件:最后一个元素不要加",").导入:

#import"JSONKit.h"

//JSONKit 通过给NSString,NSData添加分类形式,增加解析功能

//获取文件路径

NSString*file = [[NSBundlemainBundle]pathForResource:@"Model"ofType:@"geojson"];

// NSString *dataStr = [NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil];

// NSDictionary *dic = [dataStr objectFromJSONString];

// NSLog(@"ssss%@",dic);

//根据文件路径初始化得到NSData

NSData*data = [NSDatadataWithContentsOfFile:file];

//解析(可变)

NSMutableDictionary*dics = [datamutableObjectFromJSONData];

/**

* OC对象和JSON数据之间转换:将字符串,数组,字典转为JSON数据.

*/

NSString*str =@"tssssss";

NSString*str2 =@"taaaaa";

NSArray*arr2 =@[str,str2];

NSString*strJson = [arr2JSONString];

NSLog(@"%@",strJson);

NSArray*arr = dics[@"data"];

for(NSDictionary*dicinarr) {

Activity*model = [[Activityalloc]init];

//KVC赋值

[modelsetValuesForKeysWithDictionary:dic];

//存储到数组中

[self.dataSourceaddObject:model];

}

[self.tableViewreloadData];

}



优质内容筛选与推荐>>
1、Xslt利用javaScript处理字符串
2、vue项目如何部署到Tomcat中
3、启动hive错误:Exception in thread "main" java.lang.IllegalArgumentException
4、Points Versus Pixels in Cocos2D
5、ASP.NET MVC5 ModelBinder


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号