IOS编程 之 XML解析

XML JSON 解析 

XML JSON 本质上都是字符串 但有规定的格式

JSON 用于轻量级数据的传输

XML 是比较大型的数据传输 比如陌陌 (即时通讯)


 XML 可扩展标记语言  .plist 本身是一个XML文件 可以做配置文件 

数据结构的语法

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

只有一个根节点 

节点之间可以互相嵌套  

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

XML里面有两种解析方式

dom解析 sax解析  sex比较慢 是逐行解析 OC级别的解析 采用协议回调机制

dom是整体解析 自动区分出一个大型数据结构 是C语言的解析  是sex的十几倍


sex 的解析过程是由一个协议


XML文件的编写:

<root>     
    <stu_list>
        <stu_array name=“A">    name表示的是属性
            <student>
                <name>刘喆</name>
                <age>18</age>
                <tel>19000203023</tel>
            </student>
            
            <student>
                <name>刘少辉</name>
                <age>19</age>
                <tel>19044564313</tel>

            </student>
        </stu_array>
        
        <stu_array name="B">
            <student>
                <name>龚宁</name>
                <age>20</age>
                <tel>14332020302</tel>
            </student>
            
            <student>
                <name>吴东洋</name>
                <age>21</age>
                <tel>13425323432</tel>
            </student>

        </stu_array>
    </stu_list>
</root>

sax解析:

创建类  继承与NSObject 这里的类名叫做 SaxXmlParser

.m文件中得代码:

#import "SaxXmlParser.h"
#import "Model.h"
@implementation SaxXmlParser

- (void)dealloc {
    [_array release];
    _array = nil;
    [_currentValue release];
    _currentValue = nil;
    [super dealloc];
}
- (id)init{
    self = [super init];
    if (self) {
        _array = [[NSMutableArray alloc]init];
    }
    return self;
}
- (void)startParser{
    //获取bundle包的文件路径
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
    //根据路径将文件转换为NSData类型的二进制对象
    NSData *data = [NSData dataWithContentsOfFile:sourcePath];
    
    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
    
    parser.delegate = self;
    [parser parse ];//开始解析
}

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(@"%s %d",__func__,__LINE__);
    
//    NSLog(@"parser == %@ ,elementName = %@,namespaceURI== %@, qName == %@,attributeDict====%@",parser,elementName,namespaceURI,qName,attributeDict);
    if ([elementName isEqualToString:kStuArray]) {
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        [dic addEntriesFromDictionary:attributeDict];//将字典放在另一个字典里
        NSMutableArray *array1 = [NSMutableArray array];
        [dic setObject:array1 forKey:@"array1"];//把数组存在字典里
        [_array addObject:dic];//把字典给大数组
        
    }
    if ([elementName isEqualToString:kStudent]) {
        Model *model = [[Model alloc]init];
        //把model放在小数组里面
        NSMutableDictionary *lastDic = [_array lastObject];//取到大数组里的最后一个元素
        NSMutableArray *lastArr = [lastDic objectForKey:@"array1"];//取到字典里的key值对应的value的数组
        [lastArr addObject:model];//把model放在这个数组中
        
        [model release];
        
    }
    
}
//查找
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    NSLog(@"string === %@",string);
    //怎么给model的属性赋值
    
    self.currentValue = string;
    
}
//结束解析
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"%s %d",__func__,__LINE__);
    if ([elementName isEqualToString:kname]) {
        NSMutableDictionary *dic = [_array lastObject];//大数组中取出字典
        NSMutableArray *array = [dic objectForKey:@"array"];//字典中取出小数组
        
        Model *model = [array lastObject];//数组中取出最后一个元素
        model.name = _currentValue;//把对应的值放在model中
        
    }
    if ([elementName isEqualToString:kage]) {
        NSMutableDictionary *dic = [_array lastObject];
        NSMutableArray *array = [dic objectForKey:@"array"];
        
        Model *model = [array lastObject];
        model.age = self.currentValue;
        
    }
    if ([elementName isEqualToString:ktel]) {
        NSMutableDictionary *dic = [_array lastObject];
        NSMutableArray *array = [dic objectForKey:@"array"];
        
        Model *model = [array lastObject];
        model.tel = self.currentValue;
    }
    if ([elementName isEqualToString:@"root"]) {
        NSLog(@"%@",_array);
        
        [self.delegate sendModelToMain:_array];
    }
    
}

.h中得文件:

#import <Foundation/Foundation.h>



@protocol SaxXmlDelegate <NSObject>

- (void)sendModelToMain:(NSMutableArray *)array;

@end





@interface SaxXmlParser : NSObject<NSXMLParserDelegate>{
    NSMutableArray *_array;
   
}
@property (nonatomic,copy)  NSString *currentValue;
@property (nonatomic,assign)id<SaxXmlDelegate>delegate;
- (void)startParser;
@end

完成后在MainViewController中调用,代码如下:

- (void)startSax{
    SaxXmlParser *sax = [[SaxXmlParser alloc]init];
    sax.delegate = self;
    
    [sax startParser];
    
    [sax release];
}
#pragma mark
#pragma mark sax delegate
- (void)sendModelToMain:(NSMutableArray *)array{
    //把传过来的数组 全部放到定义的大数组中
    [_tableArray addObjectsFromArray:array];
   
}

dom解析相关代码  数据结构如上XML编写内容:

添加一对 GDataXMLNode类

#pragma mark
#pragma mark dom 解析
- (void)domParser{
    NSString *sourcePath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];
    NSData *data = [NSData dataWithContentsOfFile:sourcePath];
    
    GDataXMLDocument *node = [[GDataXMLDocument alloc]initWithData:data options:GDataXMLElementKind error:NULL];
    GDataXMLElement *root = [node rootElement];
    NSLog(@"%@",root);
    
    NSArray *arr = [root elementsForName:@"stu_list"];
    
    GDataXMLElement *stu_list = [arr lastObject];
    //获得节点名为stu_array的所有节点
    NSArray *stuArray = [stu_list elementsForName:@"stu_array"];
    
    for (GDataXMLElement *stuA in stuArray) {
        //获得属性名为name的节点
        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];
        
        //获得节点名为student的所有节点
        NSArray *students = [stuA elementsForName:@"student"];
        for (GDataXMLElement *stu in students) {
            
            Model *model = [[Model 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);
    
    
}






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值