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

来源:互联网 发布:淘宝网可爱宝贝纸尿裤 编辑:程序博客网 时间:2024/06/09 19:53

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

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