iOS中的数据解析之XML

首先新建一个xml文件

<root>

    <stu_list>

        <stu_array name="A">

            <student>

                <name>刘喆</name>

                <age>18</age>

                <tel>120</tel>

            </student>

            <student>

                <name>刘少悔</name>

                <age>18</age>

                <tel>114</tel>

            </student>

        </stu_array>

        <stu_array name="B">

            <student>

                <name>攻宁</name>

                <age>19</age>

                <tel>110</tel>

            </student>

            <student>

                <name>蓝翔</name>

                <age>19</age>

                <tel>110</tel>

            </student>

        </stu_array>

    </stu_list>

</root>


Sax解析





#import <Foundation/Foundation.h>


@protocol SaxXmlParserProtocol <NSObject>


- (void)sendMessage : (NSArray *)array;


@end


@interface SaxXmlParser : NSObject<NSXMLParserDelegate>

{

    NSMutableArray *_stuArray;

}

@property (nonatomic,assign) id<SaxXmlParserProtocol>delegate;

@property (nonatomic,copy) NSString *currentValue;

- (void)startParser;

@end




#import "SaxXmlParser.h"

#import "StuModel.h"

@implementation SaxXmlParser

- (void)dealloc

{

    [_currentValue release];

    [_stuArray release];

    _stuArray = nil;

    _currentValue = nil;

    [super dealloc];

}

- (id)init

{

    self = [super init];

    if (self) {

        _stuArray = [[NSMutableArray alloc]init];

        

    }

    return self;

}

//解析

- (void)startParser

{

    //获得xml文件的路径

    NSString *sourcePath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];

    //转换成二进制文件

    NSData *data = [NSData dataWithContentsOfFile:sourcePath];

    

    NSXMLParser *par = [[NSXMLParser alloc]initWithData:data];

    par.delegate = self;

    //开始解析

    [par 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


{


    

    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 *dic = [_stuArray lastObject];

        NSMutableArray *arr = [dic objectForKey:@"array"];

        [arr addObject:model];

        [model release];

    }

    

    

    

    

    

//    NSLog(@"1");

//    //第一个参数是哪个解析对象 第二个参数是节点 第五个参数是该字典

//    NSLog(@"parser=====%@,didStartElement===%@,namespaceURI====%@,qualifiedName====%@,attributes====%@",parser,elementName,namespaceURI,qName,attributeDict);

}

//结束

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

    if ([elementName isEqualToString:kName]) {

        NSMutableDictionary *dic = [_stuArray lastObject];

        NSMutableArray *arr = [dic objectForKey:@"array"];

        StuModel *model = [arr lastObject];

        model.name = _currentValue;

    }

    if ([elementName isEqualToString:kAge]) {

        NSMutableDictionary *dic = [_stuArray lastObject];

        NSMutableArray *arr = [dic objectForKey:@"array"];

        StuModel *model = [arr lastObject];

        model.age = _currentValue;

    }

    if ([elementName isEqualToString:kTel]) {

        NSMutableDictionary *dic = [_stuArray lastObject];

        NSMutableArray *arr = [dic objectForKey:@"array"];

        StuModel *model = [arr lastObject];

        model.tel = _currentValue;

    }

    if ([elementName isEqualToString:kRoot]) {

        [self sendMessage];

    }

    

    

    

    

//    NSLog(@"2");

//    // 第一个参数是解析对象 第二个参数是节点

//    NSLog(@"parser===%@,didEndElement==%@,namespaceURI===%@,qualifiedName===%@",parser,elementName,namespaceURI,qName);


    

}

//取值

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

    //获得值

    self.currentValue = string;

    

    

    

//    NSLog(@"3");

//    //第一个参数是解析对象 第二个参数是要取的值

//    NSLog(@"parser==%@,foundCharacters===%@",parser,string);


}


//协议传值

- (void)sendMessage

{

    [self.delegate sendMessage:_stuArray];

}

@end



#import <Foundation/Foundation.h>


@interface StuModel : NSObject

@property (nonatomic,copy) NSString *name;

@property (nonatomic,copy) NSString *age;

@property (nonatomic,copy) NSString *tel;

@end



#import "StuModel.h"


@implementation StuModel

- (void)dealloc

{

    [_name release];

    [_age release];

    [_tel release];

    _tel = nil;

    _name = nil;

    _age = nil;

    [super dealloc];

}

- (id)init

{

    self = [super init];

    if (self) {

        

    }

    return self;

}

@end




Dom解析

首先导入第三方文件 GDataXMLNode。h GDataXMLNode。m

然后点击工程  TARGETS下的工程 BuildSetting选下下搜索header 在HeaderSearch Path 下导入第三方文件的路径


#import <UIKit/UIKit.h>

#import "SaxXmlParser.h"

@interface MainViewController : UIViewController<SaxXmlParserProtocol>

@property (nonatomic,retain) NSMutableArray *stuArray;


@end


#pragma mark dom解析

- (void)domParser

{

    //获得xml文件的路径

    NSString *sourcePath = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"];

    //转换成二进制文件

    NSData *data = [NSData dataWithContentsOfFile:sourcePath];

    NSError *error = nil;

    GDataXMLDocument *gdData = [[GDataXMLDocument alloc]initWithData:data options:GDataXMLElementKind error:&error];

    GDataXMLElement *xmlElement = [gdData rootElement]; //获得xml中的所有数据

    NSArray *array = [xmlElement elementsForName:@"stu_list"]; 获得节点名为stu_list的所有节点 元素类型 GDataXMLElement

    GDataXMLElement *stu_list = [array firstObject];

    //获得节点名为stu_array的所有节点

    NSArray * stuarray  = [stu_list elementsForName:@"stu_array"];

    for (GDataXMLElement *stuA in stuarray) {

        //获得属性名为xx的节点

        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"];

        [_stuArray addObject:dic];

        

        //获得节点名为xx的所有节点

        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(@"%@",_stuArray);

//    NSLog(@"%@",array);

//    NSLog(@"%@",xmlElement);

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值