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

XML/JSON的几种解析方式

2014-06-25 16:35 351 查看

SAX方式解析XML数据

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

NSXMLParser是iOS自带的XML解析类。采用SAX方式解析数据

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

使用方式:

前提加入协议:<NSXMLParserDelegate>

具体使用如下:

// SAX方式解析XML数据

// 1.获得xml数据
NSString *path = [[NSBundle mainBundle] pathForResource:@"student" ofType:@"xml"];
// 2.将路径下的文件转化为NSData
NSData *data = [NSData dataWithContentsOfFile:path];
// 3.系统使用NSXMLPaser解析XML数据
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 4.设置代理
parser.delegate = self;
// 5.开始解析
[parser parse];


#pragma mark - xml解析的协议方法
// 发现标题头
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//    NSLog(@"标题头%@", elementName);
// 当节点头是student的时候 创建一个学生对象

if ([elementName isEqualToString:@"student"] == 1) {
Student *stu = [[Student alloc] init];
[self.array addObject:stu];
[stu release];
}
NSLog(@"%@", attributeDict);
}

// 发现内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//    NSLog(@"%@", string);
self.valuesStr = string;
}

// 发现节点尾
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
Student *stu = [self.array lastObject];
if ([elementName isEqualToString:@"number"] == 1) {
stu.number = [self.valuesStr integerValue];
}
if ([elementName isEqualToString:@"name"] == 1) {
stu.name = self.valuesStr;
}
if ([elementName isEqualToString:@"sex"] == 1) {
stu.sex = self.valuesStr;
}
if ([elementName isEqualToString:@"phone"] == 1) {
stu.phone = [self.valuesStr integerValue];
}
}


DOM方式解析XML数据

DOM:Document Object Model(文档对象模型)。解析时需要将XML文件整体读入,并且将XML结构化成树状,使用再通过树状结构读取相关数据。

GDataXMLNode是Google提供的开源XML解析类,对 libxml2.dylib进⾏行了Objective-C的封装

采用DOM方式解析数据

iOS中包含一个Cyuyan的动态链接库 libxml2.dylib,解析速度比NSXMLParser快

使用方式:

将GDataXMLNode.h GDataXMLNode.m 导入文件

在Header Search Paths 中添加 /usr/include/libxml2



在Other Linker Flags 中添加 -lxml2



OK,完成导入文件

具体使用如下:

NSString *path = [[NSBundle mainBundle] pathForResource:@"student" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];

// GDataXMLNode类的使用
// 1.获取xml文件的 文件结构
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

// 2.获取xml文件的根节点(rootElement)
GDataXMLElement *rootElement = [document rootElement];

// 3.获取 子节点(根据节点的名字)
NSArray *elements = [rootElement elementsForName:@"student"];

// 4.循环 遍历 所有子结点, 进一步获取数据
for (GDataXMLElement *element in elements) {
NSArray *nameElements = [element elementsForName:@"name"];
GDataXMLElement *nameNode = [nameElements firstObject];
NSString *name = [nameNode stringValue];

GDataXMLElement *numberElements = [[element elementsForName:@"number"] firstObject];
NSInteger number = [[numberElements stringValue] integerValue];

GDataXMLElement *sexElements = [[element elementsForName:@"sex"] firstObject];
NSString *sex = [sexElements stringValue];

GDataXMLElement *phontElements = [[element elementsForName:@"phone"]firstObject];
NSInteger phone = [[phontElements stringValue] integerValue];

Student *stu = [[Student alloc] init];
stu.name = name;
stu.number = number;
stu.sex = sex;
stu.phone = phone;
[_array addObject:stu];
[stu release];
}
NSLog(@"%@", _array);


使用Foundation进行JSON解析

// 1.获得文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"studentJSON" ofType:@"txt"];
NSData *data = [NSData dataWithContentsOfFile:path];

// 2.解析
id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@", object);


使用JSONKit进行JSON解析

JSONKit是Object-C一个处理json数据的库,非常高效而且易用。

使用方法:

将包JSONKit导入到工程中
具体使用如下:
NSString *path = [[NSBundle mainBundle] pathForResource:@"studentJSON" ofType:@"txt"];
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSArray *arrlist = [str objectFromJSONString];
NSLog(@"%d", [arrlist count]);
for (int i = 0; i < [arrlist count]; i ++) {
NSDictionary *dic = [arrlist objectAtIndex:i];
NSString *name = [dic objectForKey:@"name"];
NSLog(@"%@", name);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: