IOS 高级编程 XML 数据结构解析


所谓的解析无非就是:从事先规定好的格式中提取数据。

IOS 开发常见的解析:XML 解析 (用的不是很多, 大约20%左右,一般大项目能用到)、 JSON解析(这个用得非常的多)


XML 数据结构的语法:

一对尖括号代表一个节点,或者标签

只有一个根节点

节点可以互相嵌套

没有子节点的节点称谓叶子节点 


让我们在自己的工程中创建一个Property List

<root>
    <stu_list>
        <stu_array name="A">
            <student>
                <name>刘喆</name>
                <age>18</age>
                <tel>120</tel>
            </student>
            <student>
                <name>刘少辉</name>
                <age>12</age>
                <tel>114</tel>
            </student>
         </stu_array>
        <stu_array name="B">
            <student>
                <name>龚宁</name>
                <age>17</age>
                <tel>114</tel>
            </student>
            <student>
                <name>吴东洋</name>
                <age>10</age>
                <tel>888</tel>
            </student>
        </stu_array>
    </stu_list>
</root>

我们先用代码把 XML 引入进来, 代码如下:


#pragma mark
#pragma Dom 解析
- (void)domParser{
    NSString *Path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml" ];
    //将这东西转换格式二进制对象
    NSData *data = [NSData dataWithContentsOfFile:Path];
//    NSError *error = nil;
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:GDataXMLElementKind error:NULL];
    
    GDataXMLElement *root = [doc rootElement];
    NSLog(@"root === %@",root);
    
    NSArray *arr = [root elementsForName:@"stu_list"];
    
    GDataXMLElement *stu_list = [arr firstObject];
    
    NSArray *stuarray = [stu_list elementsForName:@"stu_array"];//获得节点名为stu_array的所有节点
    
    for (GDataXMLElement *stuA in stuarray) {
        
        GDataXMLNode *node = [stuA attributeForName:@"name"];
        
        NSString *attStr = [node stringValue];//取节点所对应的内容
        
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        [dic setObject:attStr forKey:@"name"];
        
        NSMutableArray *array = [NSMutableArray array];
        
        [dic setObject:array forKey:@"array"];
        
        [_tableArray addObject:dic];
        //获得节点名字为sutdents的所有节点
        NSArray *students = [stuA elementsForName:@"student"];
        
        for (GDataXMLElement *stu in students) {
            
            StuModel *model = [[StuModel alloc]init];
            
            [array addObject:model];
            
            [model release];
            
            //获得所有student的子节点
            
            NSArray *children = [stu children];
            
            for (GDataXMLElement *child in children) {
                //取出节点内容
                NSString *childValue = [child stringValue];
                //判断节点名
                if ([[child name] isEqualToString:@"name"]) {
                    model.name = childValue;
                } if ([[child name] isEqualToString:@"age"]) {
                    model.age = childValue;
                }if ([[child name] isEqualToString:@"tel"]) {
                    model.tel = childValue;
                }
            }
        }
        
    }
    
    NSLog(@"arr====%@",stuarray);
    
}

执行解析协议

@interface SaxXmlParser : NSObject<NSXMLParserDelegate>{
    
    
    NSMutableArray *_stuArray;
    
    
    
}


@property (nonatomic,retain)NSString *currentValue;
@property (nonatomic,assign)id<SaxmlParserDelegate>delegate;
- (void)startParser;

解析的具体过程

//sax 解析啦
- (void)startParser{
    //找路径 在BUNDLE包里
    NSString *Path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml" ];
    //将这东西转换格式二进制对象
    NSData *data = [NSData dataWithContentsOfFile:Path];
    //初始化
    NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithData:data];
    
    xmlParser.delegate = self;
    [xmlParser parse];//执行解析
    
}


static NSString *kRoot = @"root";
static NSString *kStuArray = @"stu_array";
static NSString *kStudent = @"student";
static NSString *kName = @"name";
static NSString *kAge = @"age";
static NSString *kTel = @"tel";

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
//    NSLog(@"parser=====%@,elementName======%@,namespaceURT ======%@,qName========%@,attributeDict=======%@",parser,elementName,namespaceURI,qName,attributeDict);
//    NSLog(@"%s======3",__func__);
    if ([elementName isEqualToString:kStuArray]) {
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        [dic addEntriesFromDictionary:attributeDict];//把另外一个字典所有内容取出来放在领一个字典内
        NSMutableArray *arr = [NSMutableArray array];
        [dic setObject:arr forKey:@"array"];
        [_stuArray addObject:dic];//把整体的字典给大数组
    }
    if ([elementName isEqualToString:kStudent]) {
        StuModel *model = [[StuModel alloc] init];
        NSMutableDictionary *lastDic = [_stuArray lastObject];
        NSMutableArray *lastArr = [lastDic objectForKey:@"array"];
        [lastArr addObject:model];
        [model release];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    
    NSLog(@"parser======%@,string=======%@",parser,string);
    NSLog(@"%s=====1",__func__);
    self.currentValue = string;
    
}


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if ([elementName isEqualToString:kName]) {//名字判断
        NSMutableDictionary *dic = [_stuArray lastObject];
        NSMutableArray *array = [dic objectForKey:@"array"];
        StuModel *model = [array lastObject];
        model.name = _currentValue;
    }
    if ([elementName isEqualToString:kAge]) {//年龄判断
        NSMutableDictionary *dic1 = [_stuArray lastObject];
        NSMutableArray *array = [dic1 objectForKey:@"array"];
        StuModel *model1 = [array lastObject];
        model1.age = _currentValue;
    }
    if ([elementName isEqualToString:kTel]) {//手机判断
        NSMutableDictionary *dic1 = [_stuArray lastObject];
        NSMutableArray *array = [dic1 objectForKey:@"array"];
        StuModel *model1 = [array lastObject];
        model1.tel = _currentValue;
    }
    if ([elementName isEqualToString:kRoot]) {
        NSLog(@"stuArray===========%@",_stuArray);
        
        [self.delegate parserFinished:_stuArray];
    }
    NSLog(@"%s=======2",__func__);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值