天天看点

iOS开发网络--XML解析基础pragma mark – SAX解析 NSXMLParserDelegate

解析: 就是以约定好的格式,后台开发人员将数据进行存储,前台人员进行按照对应格式进行数据获取的过程. 数据格式是由后台人员决定,我们无权干涉.

当今流行的数据格式XML和JSON

对于我们来说数据解析就是根据XML 或者JSON的格式进行数据读取.

XML解析方式主要有两种 一个是SAX解析 一个是DOM解析.

代码中设置的属性

@property (nonatomic,copy)NSString *contentStr; //记录读取内容
@property (nonatomic,retain)NSMutableDictionary *categortyDic;//分类
@property (nonatomic,retain)NSMutableArray *categortArr; //分类数组
           

1:SAX解析是系统提供的 是根据协议代理回调的方式进行数据获取,他在数据解析时候,是将数据一条一条的进行读取解析,适合大型数据 遵守 协议

- (IBAction)SAXParser:(id)sender {
    //创建字典  只有一个字典
    self.categortyDic = [NSMutableDictionary dictionary];
    //1:获取文件路径
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Categories" ofType:@"xml"];
    //2.读取文件内容
    NSData *parserData = [NSData dataWithContentsOfFile:filePath];
    //3.创建解析对象
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:parserData];
    //4.设置代理
    parser.delegate = self;
    //5.解析
    [parser parse];

    //遍历字典
    for (NSString *key in _categortyDic) {
        //获取对应分组
        NSMutableArray *group = [_categortyDic valueForKey:key];
        NSLog(@"------------%@--------------",key);
        //b遍历分组
        for (NSString *str in group) {
            NSLog(@"%@",str);
        }
    }
}
           

pragma mark – SAX解析 NSXMLParserDelegate

//读取到开始标签
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    if ([elementName isEqualToString:@"category_name"]) {
        //创建对应分组
        self.categortArr = [NSMutableArray array];
    }
}
//获取内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    //记录读取内容
    self.contentStr = string;
}
//读取到结束标签
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if ([elementName isEqualToString:@"category_name"]) {
        //将对应分组放入 字典中  读取的内容 例如:美食 作为key
        [_categortyDic setValue:_categortArr forKey:_contentStr];
    }else if ([elementName isEqualToString:@"subcategories"])
    {
        //就把内容放到数组里面  例如 : 四川菜
        [_categortArr addObject:_contentStr];
    }  
}
           

2: DOM 解析 一般我们使用由谷歌提供的第三方GDataXMLNode进行解析 对于DOM解析,会将数据整个读入内存,形成一个树形结构,我们通过树形结构的层级进行数据的获取, 适合小型数据.

对应GDataXMLNode 是在C语言动态链接基础上进行OC语言的XML解析工具.

在使用时候我们需要进行三部配置:

(1):导入动态链接库 libxml2.2.dylib

(2):在 Header Search Path 中配置 /usr/include/libxml2

(3):在other Linker 中配置 -lxml2

- (IBAction)DOMParser:(id)sender {
    //创建字典 承装解析后的数据
    self.categortyDic = [NSMutableDictionary dictionary];
    //1: 获取文件路径
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Categories(1)" ofType:@"xml"];
    //2: 读取文件内容
    NSString *patrserStr = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    //3: 将需要解析的内容读入 document
    GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc]initWithXMLString:patrserStr options: error:nil];
    //获取根节点
    GDataXMLElement *rootElement = [xmlDocument rootElement];
    //5: 获取子节点们
//    NSArray *elements = [rootElement elementsForName:@"status"];
//    GDataXMLElement *status = [elements firstObject];
//    NSString *statusValue = [status stringValue];
//    NSLog(@"%@",statusValue);   //获取OK
    NSArray *elements = [rootElement elementsForName:@"categories"];
    //遍历遍历每一个子节点
    for (GDataXMLElement *element in elements) {
        //获取下一级的子节点
        NSArray *names = [element elementsForName:@"category_name"];
        NSArray *subcategories = [element elementsForName:@"subcategories"];
        //获取叶子节点的值
        NSString *categoryName = [[names firstObject]stringValue];
        NSLog(@"--------------%@-------------",categoryName);
        //创建对应分组
        NSMutableArray *group = [NSMutableArray array];

        //将分组放入字典
        [_categortyDic setValue:group forKey:categoryName];

        //遍历子节点们
        for (GDataXMLElement *element in subcategories) {
            //获取叶子节点的值
            NSString *subStr = [element stringValue];
            NSLog(@"%@",subStr);
            //将值放入对应的分组
            [group addObject:subStr];
        }
        NSLog(@"%@",group);
    }
}