XML
DOM解析
DOM:Document Object Model(文档对象模型)。解析时需要
将XML文件整体读⼊,并且将XML结构化成树状,使用时再通过树 状结构读取相关数据
XML完整读入才能解析,不能出现错误!
SAX解析
SAX:Simple API for XML。基于事件驱动的解析方式,逐行解析 数据。(采用协议回调机制)
NSXMLParser是iOS自带的XML解析类。采用SAX方式解析数据。
解析过程由NSXMLParserDelegate协议方法回调
解析过程:开始标签->取值->结束标签->取值
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"teacher" ofType:@"xml"];
#pragma mark ---------SAX方式XML解析----------
//从XML文档的路径里面 获取到一个NSData类型的对象,当做初始化解析对的参数
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];//开始启动解析的方法
#pragma mark xmlparser
//step 1 :准备解析
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
}
//step 2:准备解析节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"%@ 的开标签",elementName);
}
//step 3:获取首尾节点间内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"%@",string);
}
//step 4 :解析完当前节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"%@ 的闭标签",elementName);
}
//step 5:解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
}
//step 6:获取cdata块数据
- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
{
}
介绍一种第三方的xml解析类库,GDateXMLNode,这个类库是谷歌的
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"teacher" ofType:@"xml"];
NSString *xmlStr = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
//根据xml的一个字符串(xmlStr),生成一个xm文档,文档里面包含了版本号,编码格式,根节点,叶节点,节点信息,还提供了方法,从文档中获取某个节点下地信息.
//下面这个代码已经完成了xml解析,也就是说,后面的人名字的信息已经从整个字符串中抽离出来了.以节点内容的形式存放到了文档中
#pragma mark ---------以文档的方式来整理----------
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];
//首先我得找到我的根节点 例如我们要从xml里面找一个name为安浩的
GDataXMLElement *root = document.rootElement;
//获取root下地所有孩子节点
NSArray *children = [root children];
NSArray *children2 = [children[2] children];
//这样的方式来找,还要我们知道xml文件的在第几个来找确定的值 一层一层的孩子找下去,个人感觉不是很方便的
//创建一个节点来保存 安浩姓名的节点 GDataXMLNode节点
GDataXMLNode *anhao = children2[1];
//打印安浩的姓名节点和安浩姓名的字符串
NSLog(@"name is %@",anhao); //节点
NSLog(@"name is %@",[anhao stringValue]); //字符串
// GDataXMLElement 获取元素的方式
GDataXMLElement *root = document.rootElement;
NSArray *arr = [root elementsForName:@"teacher"];
NSArray *arr2 = [arr[2] elementsForName:@"name"]; //注意的是即使知道这个位置就一个元素也不能用字符串获取
NSLog(@"name is %@",[arr2[0] stringValue]);
//forin遍历
for(GDataXMLNode *node in [root children])
for (GDataXMLNode *valueNode in [node children]) {
NSLog(@"%@",[valueNode stringValue]);
}
//绝对路径
//1从根节点出发
NSArray *arr = [root nodesForXPath:@"teacher/name" error:nil];
NSLog(@"%@",[arr[2] stringValue]);
//文档读取 绝对路径
//2从文档出发
NSArray *arr1 = [document nodesForXPath:@"teachers/teacher/name" error:nil];
NSLog(@"%@",[arr1[2] stringValue]);
//相对路径,从文档出发
NSArray *arr2 = [document nodesForXPath:@"//name" error:nil];
NSLog(@"%@",[arr2[2] stringValue]);
*/
Json解析
//先读取本地的json文件
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"teacher" ofType:@"json"];
#pragma mark --------系统自带的Json解析类NSJSONSerialization----
//别看它只是简单地一句话,已经完成了Json解析的过程
NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:nil];
NSLog(@"%@",array);
//通过解析Json数据得到的是一个字典,通过key找到key对应的数据数组,遍历数据数组中的字典,给我们的cell模型赋值 通过KVC
NSDictionary *dic1 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves error:nil];
NSArray *arr1 = [dic objectForKey:@"result"];
for (NSDictionary *dic in arr1) {
<#statements#>
}
//直接解析Json得到就是个数组,并且数组保存的是一个个字典,便利数组中的字典,通过KVC 直接给cell模型赋值
for (NSDictionary *dic in array) {
[xxx setValuesForKeysWithDictionary:dic];
}
#pragma mark --------第三方类库JSONKit解析Json数据----
//1.从一个(通过)NSDate对象解析得到数据容器
//从文件路径中 得到一个NSDate对象
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSArray *arr1 = [data objectFromJSONData];
// NSLog(@"arr1 is %@",arr1);
//2.从一个(通过)NSSting对象解析到得到数据容器
NSString *str = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSArray *arr2 = [str objectFromJSONString];
NSLog(@"%@",arr2);
On the road。。。