XML.JSON数据接口解析
2014-08-05 10:44
253 查看
XML解析
1. SAX 解析:
Simple API for XML 利用代理的三个方法来实现逐行解析
创建:一个类 SAXXMLPaser
SAXXMLPaser.h
//优点: 数据损坏的时候 可以读取未损坏之前的数据
//缺点: 数据写错的时候就会直接结束 不继续解析
@interface SAXXMLPaser : NSObject<NSXMLParserDelegate]] > //xml
SAX解析的代理协议
@property (nonatomic,retain)NSString *
currentString;//储存每个叶子节点的字符串
@property (nonatomic,retain)NSMutableArray *
dataArr;//存储所有的学生对象
//开始解析
- (void)startPaser;
SAXXMLPaser.m
- (instancetype)init
{
self =
[super init];
if (self)
{
self.dataArr =
[NSMutableArray array];
}
return self;
}
- (void)dealloc
{
[self.dataArr release];
[self.currentString release];
[super dealloc];
}
- (void)startPaser
{
//1.获得要解析的数据
NSString *
xmlPath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"XML"];//文件途径
NSData *
data = [NSData dataWithContentsOfFile:xmlPath];
//检验是否成功转换成字符串
NSString *
str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//xml SAX解析使用的类
NSXMLParser *
xmlPaser = [[NSXMLParser alloc] initWithData:data];
//1.设置代理
xmlPaser.delegate = self;
//2.开始解析
[xmlPaser parse];
}
#warning 当他遇到前面的节点 节点头
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"%@",elementName);
//通过判断节点名 student 来创建学生
if([elementName isEqualToString:@"student"])
{
Student *
student = [[Student alloc] init];
//将对象加入到数组中
[self.dataArr addObject:student];
[student release];
}
}
#warning 遇到里面的内容的时候会走这个方法 节点内容
- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{
NSLog(@"%@",string);
//存储当前的字符串
self.currentString =
string;
}
#warning 当遇到后面那个节点的时候调用方法
-(void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
Student *
student = [self.dataArr lastObject];
//将字符串
if([elementName isEqualToString:@"name"])
{
student.name = self.currentString;
}
else if ([elementName isEqualToString:@"sex"])
{
student.sex = self.currentString;
}
else if([elementName isEqualToString:@"number"])
{
student.number =
[self.currentString integerValue];
}
NSLog(@"%@",elementName);
}
1. DOMXML解析 节点状解析
(1)首先需要使用到第三方的类GDataXMLNode.h GDataXMLNode.m
// libxml includes require that the target Header Search Paths contain
//
// /usr/include/libxml2
//
// and Other Linker Flags contain
//
// -lxml2
-1.根据提示搜索Header Search Paths 添加进去 /usr/include/libxml2
-2.根据提示搜索Other Linker Flags 添加进去 -lxml2
(2)创建一个类:DOMXMLPaser
DOMXMLPaser.h
- (void)startPaser;
@property (nonatomic,retain)NSMutableArray *
dataArr;
DOMXMLPaser.m
- (instancetype)init
{
self = [super init];
if (self) {
self.dataArr = [NSMutableArray array];
}
return self;
}
- (void)dealloc
{
[self.dataArr release];
[super dealloc];
}
- (void)startPaser
{
//1.获取数据
NSString * domPath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"XML"];
NSData * data = [NSData dataWithContentsOfFile:domPath];
NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//2.解析数据
NSError * error = nil;//创建一个错误指针
GDataXMLDocument * document = [[GDataXMLDocument alloc] initWithData:data options:GDataXMLDocumentKind error:&error];
if (error != nil) {
NSLog(@"错误信息:
%@",error);
}
//解析1.获得结构的 根节点
GDataXMLElement * rootElement = [document rootElement];
//解析2.获得根节点的子节点
//根据节点名字获得
NSArray * arr = [rootElement elementsForName:@"student"];
//解析3.对数组进行遍历
for (GDataXMLElement * node in arr)
{
//对子节点node的子节点name 解析
NSArray * nameNodes = [node elementsForName:@"name"];
GDataXMLElement * nameNode = [nameNodes lastObject];
//将节点转变为字符串(这个类自己带的)
NSString * name = [nameNode stringValue];
NSArray * sexNodes = [node elementsForName:@"sex"];
GDataXMLElement * sexNode = [sexNodes lastObject];
NSString * sex = [sexNode stringValue];
NSArray * numberNodes = [node elementsForName:@"number"];
GDataXMLElement * numberNode = [numberNodes lastObject];
NSInteger number = [[numberNode stringValue] integerValue];
NSLog(@"name : %@ sex: %@,number : %d",name,sex,number);
}
}
一.JSON解析 不需要创建一个类
//1.获取文件 参数1:文件名 参数2:文件类型
NSString * jsonPath = [[NSBundle mainBundle] pathForResource:@"JSON" ofType:@"txt"];
NSData * data = [NSData dataWithContentsOfFile:jsonPath];
NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//2.解析
NSError * error = nil;
NSMutableArray * arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
//将字典或者字符串 转换为JSON类型的
// NSJSONSerialization dataWithJSONObject:<#(id)#> options:<#(NSJSONWritingOptions)#> error:<#(NSError **)#>
NSLog(@"%@",arr);
for (NSMutableDictionary * dic in arr)
{
Student * student = [[Student alloc] init];
student.name = [dic objectForKey:@"name"];
student.sex = [dic objectForKey:@"sex"];
student.number = [[dic objectForKey:@"number"] intValue];
NSLog(@"%@ %@ %d",student.name,student.sex,student.number);
}
1. SAX 解析:
Simple API for XML 利用代理的三个方法来实现逐行解析
创建:一个类 SAXXMLPaser
SAXXMLPaser.h
//优点: 数据损坏的时候 可以读取未损坏之前的数据
//缺点: 数据写错的时候就会直接结束 不继续解析
@interface SAXXMLPaser : NSObject<NSXMLParserDelegate]] > //xml
SAX解析的代理协议
@property (nonatomic,retain)NSString *
currentString;//储存每个叶子节点的字符串
@property (nonatomic,retain)NSMutableArray *
dataArr;//存储所有的学生对象
//开始解析
- (void)startPaser;
SAXXMLPaser.m
- (instancetype)init
{
self =
[super init];
if (self)
{
self.dataArr =
[NSMutableArray array];
}
return self;
}
- (void)dealloc
{
[self.dataArr release];
[self.currentString release];
[super dealloc];
}
- (void)startPaser
{
//1.获得要解析的数据
NSString *
xmlPath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"XML"];//文件途径
NSData *
data = [NSData dataWithContentsOfFile:xmlPath];
//检验是否成功转换成字符串
NSString *
str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//xml SAX解析使用的类
NSXMLParser *
xmlPaser = [[NSXMLParser alloc] initWithData:data];
//1.设置代理
xmlPaser.delegate = self;
//2.开始解析
[xmlPaser parse];
}
#warning 当他遇到前面的节点 节点头
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"%@",elementName);
//通过判断节点名 student 来创建学生
if([elementName isEqualToString:@"student"])
{
Student *
student = [[Student alloc] init];
//将对象加入到数组中
[self.dataArr addObject:student];
[student release];
}
}
#warning 遇到里面的内容的时候会走这个方法 节点内容
- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{
NSLog(@"%@",string);
//存储当前的字符串
self.currentString =
string;
}
#warning 当遇到后面那个节点的时候调用方法
-(void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
Student *
student = [self.dataArr lastObject];
//将字符串
if([elementName isEqualToString:@"name"])
{
student.name = self.currentString;
}
else if ([elementName isEqualToString:@"sex"])
{
student.sex = self.currentString;
}
else if([elementName isEqualToString:@"number"])
{
student.number =
[self.currentString integerValue];
}
NSLog(@"%@",elementName);
}
1. DOMXML解析 节点状解析
(1)首先需要使用到第三方的类GDataXMLNode.h GDataXMLNode.m
// libxml includes require that the target Header Search Paths contain
//
// /usr/include/libxml2
//
// and Other Linker Flags contain
//
// -lxml2
-1.根据提示搜索Header Search Paths 添加进去 /usr/include/libxml2
-2.根据提示搜索Other Linker Flags 添加进去 -lxml2
(2)创建一个类:DOMXMLPaser
DOMXMLPaser.h
- (void)startPaser;
@property (nonatomic,retain)NSMutableArray *
dataArr;
DOMXMLPaser.m
- (instancetype)init
{
self = [super init];
if (self) {
self.dataArr = [NSMutableArray array];
}
return self;
}
- (void)dealloc
{
[self.dataArr release];
[super dealloc];
}
- (void)startPaser
{
//1.获取数据
NSString * domPath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"XML"];
NSData * data = [NSData dataWithContentsOfFile:domPath];
NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//2.解析数据
NSError * error = nil;//创建一个错误指针
GDataXMLDocument * document = [[GDataXMLDocument alloc] initWithData:data options:GDataXMLDocumentKind error:&error];
if (error != nil) {
NSLog(@"错误信息:
%@",error);
}
//解析1.获得结构的 根节点
GDataXMLElement * rootElement = [document rootElement];
//解析2.获得根节点的子节点
//根据节点名字获得
NSArray * arr = [rootElement elementsForName:@"student"];
//解析3.对数组进行遍历
for (GDataXMLElement * node in arr)
{
//对子节点node的子节点name 解析
NSArray * nameNodes = [node elementsForName:@"name"];
GDataXMLElement * nameNode = [nameNodes lastObject];
//将节点转变为字符串(这个类自己带的)
NSString * name = [nameNode stringValue];
NSArray * sexNodes = [node elementsForName:@"sex"];
GDataXMLElement * sexNode = [sexNodes lastObject];
NSString * sex = [sexNode stringValue];
NSArray * numberNodes = [node elementsForName:@"number"];
GDataXMLElement * numberNode = [numberNodes lastObject];
NSInteger number = [[numberNode stringValue] integerValue];
NSLog(@"name : %@ sex: %@,number : %d",name,sex,number);
}
}
一.JSON解析 不需要创建一个类
//1.获取文件 参数1:文件名 参数2:文件类型
NSString * jsonPath = [[NSBundle mainBundle] pathForResource:@"JSON" ofType:@"txt"];
NSData * data = [NSData dataWithContentsOfFile:jsonPath];
NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
//2.解析
NSError * error = nil;
NSMutableArray * arr = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
//将字典或者字符串 转换为JSON类型的
// NSJSONSerialization dataWithJSONObject:<#(id)#> options:<#(NSJSONWritingOptions)#> error:<#(NSError **)#>
NSLog(@"%@",arr);
for (NSMutableDictionary * dic in arr)
{
Student * student = [[Student alloc] init];
student.name = [dic objectForKey:@"name"];
student.sex = [dic objectForKey:@"sex"];
student.number = [[dic objectForKey:@"number"] intValue];
NSLog(@"%@ %@ %d",student.name,student.sex,student.number);
}
相关文章推荐
- asp通过json调用webservice接口,并获取返回的xml数据及解析
- Android访问网络系列之--服务端返回XML或JSON格式数据,Android 进行解析并显示
- 程序调试时用到的XML或者JSON数据接口(支持返回图片信息)
- 在 Android 应用程序中使用 Internet 数据 解析 XML、JSON 和 protocol buffers 数据
- 【iOS】Plist-XML-JSON数据解析
- xml json 数据封装 传递(序列化) 解析
- Android 获取Google Weather API 并通过Xml和JSON解析数据
- Java XML JSON 数据解析
- IOS 请求数据解析 XML 和 JSON
- java通过url获取页面数据 java解析xml 基金净值接口使用方法
- 两种接口传送数据协议(xml和json)
- win8 解析json数据模板 XMl解析数据
- android 解析网络xml数据,发送xml数据,解析json数据
- IOS 请求数据解析 XML 和 JSON
- Android Json 数据解析 II 之 ------xml ,json 两种数据格式之对比
- 使用json解析国家气象局(天气预报)接口数据
- 【Android应用开发】-(17)获取Google天气预报通过Xml和JSON解析数据
- Android 获取Google Weather API 并通过Xml和JSON解析数据
- Unity3d-XML文件数据解析&JSON数据解析
- android之json数据和xml数据的回传和解析