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

 posted on 2015-05-09 14:15  ianhao_cn  阅读(208)  评论(0编辑  收藏  举报