您的位置:首页 > 移动开发 > IOS开发

iOS中的数据解析之XML

2014-07-09 20:16 381 查看
首先新建一个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 = @"na
f1a2
me";
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: