您的位置:首页 > Web前端 > JavaScript

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: