UI-XML数据解析

XML解析
  1. SAX 解析: Simple API for XML  利用代理的三个方法来实现逐行解析

创建:一个类 SAXXMLPaser

SAXXMLPaser.h


//优点: 数据损坏的时候 可以读取未损坏之前的数据

//缺点: 数据写错的时候就会直接结束  不继续解析

@interface SAXXMLPaser : NSObject<NSXMLParserDelegate>//xml SAX解析的代理协议


@property (nonatomic,retain)NSString * currentString;//储存每个叶子节点的字符串


@property (nonatomic,retain)NSMutableArray * dataArr;//存储所有的学生对象


//开始解析

- (void)startPaser;








SAXXMLPaser.m



- (instancetype)init

{

    self = [super init];

    if (self) {

        self.dataArr = [NSMutableArray array];

    }

    return self;

}


- (void)dealloc

{

    

    [self.dataArr release];

    

    [self.currentString release];

    

    [super dealloc];

    

}


- (void)startPaser

{

    //1.获得要解析的数据

    NSString * xmlPath = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"XML"];//文件途径

    

    NSData * data = [NSData dataWithContentsOfFile:xmlPath];

    

    

    //检验是否成功转换成字符串

    NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];


    NSLog(@"%@",str);

    

    //xml SAX解析使用的类

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

    //1.设置代理

    xmlPaser.delegate = self;

    

    

    //2.开始解析

    

    [xmlPaser parse];   

}


#warning  当他遇到前面的节点  节点头


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{

    NSLog(@"%@",elementName);

    

    //通过判断节点名 student 来创建学生

    if ([elementName isEqualToString:@"student"]) {

        

        Student * student = [[Student alloc] init];

        

        //将对象加入到数组中

        [self.dataArr addObject:student];

        

        [student release];

        

        

    }

   

}


#warning 遇到里面的内容的时候会走这个方法  节点内容


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

{

    

    NSLog(@"%@",string);

    //存储当前的字符串

    self.currentString = string;

  

}


#warning 当遇到后面那个节点的时候调用方法  


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

{

    Student * student = [self.dataArr lastObject];

    

    //将字符串

    if ([elementName isEqualToString:@"name"]) {

         student.name = self.currentString;

    }

    else if ([elementName isEqualToString:@"sex"]) {

        student.sex = self.currentString;

        

    }

    else if([elementName isEqualToString:@"number"]) {

        student.number = [self.currentString integerValue];

    }

    NSLog(@"%@",elementName);

    

}




  1. DOMXML解析  节点状解析

(1)首先需要使用到第三方的类GDataXMLNode.h GDataXMLNode.m

// libxml includes require that the target Header Search Paths contain

//

//   /usr/include/libxml2

//

// and Other Linker Flags contain

//

//   -lxml2



-1.根据提示搜索Header Search Paths 添加进去 /usr/include/libxml2

-2.根据提示搜索Other Linker Flags 添加进去 -lxml2



(2)创建一个类:DOMXMLPaser


DOMXMLPaser.h


- (void)startPaser;


@property (nonatomic,retain)NSMutableArray * dataArr;



DOMXMLPaser.m


- (instancetype)init

{

    self = [super init];

    if (self) {

        self.dataArr = [NSMutableArray array];

    }

    return self;

}


- (void)dealloc

{

    [self.dataArr release];

    

    [super dealloc];

    

}

- (void)startPaser

{

    

    //1.获取数据

    NSString  * domPath  = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"XML"];

    

    NSData * data = [NSData dataWithContentsOfFile:domPath];

    

    NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    

    NSLog(@"%@",str);

    

    //2.解析数据

    NSError * error = nil;//创建一个错误指针

    

    GDataXMLDocument * document = [[GDataXMLDocument alloc] initWithData:data options:GDataXMLDocumentKind error:&error];

    

    if (error != nil) {

        

        NSLog(@"错误信息: %@",error);

        

    }

    //解析1.获得结构的 根节点

    GDataXMLElement * rootElement = [document rootElement];

    

    //解析2.获得根节点的子节点

    //根据节点名字获得

    NSArray * arr = [rootElement elementsForName:@"student"];

    

    //解析3.对数组进行遍历

    

    for (GDataXMLElement * node in arr) {

        

        //对子节点node的子节点name 解析

        NSArray * nameNodes = [node elementsForName:@"name"];

        

        GDataXMLElement * nameNode = [nameNodes lastObject];

        

        //将节点转变为字符串(这个类自己带的)

        NSString * name = [nameNode stringValue];

        

        

        NSArray * sexNodes = [node elementsForName:@"sex"];

        

        GDataXMLElement * sexNode = [sexNodes lastObject];

        

        NSString * sex = [sexNode stringValue];

        

        

        

        NSArray * numberNodes = [node elementsForName:@"number"];

        

        GDataXMLElement * numberNode = [numberNodes lastObject];

        

        NSInteger number = [[numberNode stringValue] integerValue];


        NSLog(@"name : %@ sex: %@,number : %d",name,sex,number);

 

}


}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值