XML.JSON数据结构解析

来源:互联网 发布:python中文手册 编辑:程序博客网 时间:2024/05/19 15:44

一.   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 = [superinit];

    if (self) {

        self.dataArr = [NSMutableArrayarray];

    }

    return self;

}

 

- (void)dealloc

{

   

    [self.dataArrrelease];

   

    [self.currentStringrelease];

   

    [super dealloc];

   

}

 

- (void)startPaser

{

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

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

   

    NSData * data = [NSDatadataWithContentsOfFile:xmlPath];

   

   

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

    NSString * str = [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];

 

    NSLog(@"%@",str);

   

    //xml SAX解析使用的类

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

    //1.设置代理

    xmlPaser.delegate = self;

   

   

    //2.开始解析

   

    [xmlPaser parse];  

}

 

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

 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{

    NSLog(@"%@",elementName);

   

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

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

       

        Student * student = [[Studentalloc] init];

       

        //将对象加入到数组中

        [self.dataArraddObject:student];

       

        [student release];

       

       

    }

  

}

 

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

 

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

{

   

    NSLog(@"%@",string);

    //存储当前的字符串

    self.currentString = string;

 

}

 

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

 

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName

{

    Student * student = [self.dataArrlastObject];

   

    //将字符串

    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.currentStringintegerValue];

    }

    NSLog(@"%@",elementName);

   

}

 

 

 

2.  DOMXML解析 节点状解析

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

// libxml includes require that the target Header SearchPaths 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 = [superinit];

    if (self) {

        self.dataArr = [NSMutableArrayarray];

    }

    return self;

}

 

- (void)dealloc

{

    [self.dataArrrelease];

   

    [super dealloc];

    

}

- (void)startPaser

{

   

    //1.获取数据

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

   

    NSData * data = [NSDatadataWithContentsOfFile:domPath];

   

    NSString * str = [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];

   

    NSLog(@"%@",str);

   

    //2.解析数据

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

   

    GDataXMLDocument * document = [[GDataXMLDocumentalloc] initWithData:dataoptions:GDataXMLDocumentKinderror:&error];

   

    if (error != nil) {

       

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

       

    }

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

    GDataXMLElement * rootElement = [documentrootElement];

   

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

    //根据节点名字获得

    NSArray * arr = [rootElementelementsForName:@"student"];

   

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

   

    for (GDataXMLElement * nodein arr) {

       

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

        NSArray * nameNodes = [nodeelementsForName:@"name"];

       

        GDataXMLElement * nameNode = [nameNodeslastObject];

       

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

        NSString * name = [nameNodestringValue];

       

       

        NSArray * sexNodes = [nodeelementsForName:@"sex"];

       

        GDataXMLElement * sexNode = [sexNodeslastObject];

       

        NSString * sex = [sexNodestringValue];

       

       

       

        NSArray * numberNodes = [nodeelementsForName:@"number"];

       

        GDataXMLElement * numberNode = [numberNodeslastObject];

       

        NSInteger number = [[numberNodestringValue] integerValue];

 

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

 

}

 

}

 

 

二.JSON解析  不需要创建一个类

 

//1.获取文件 参数1:文件名   参数2:文件类型

    NSString * jsonPath = [[NSBundlemainBundle] pathForResource:@"JSON"ofType:@"txt"];

   

    NSData * data = [NSDatadataWithContentsOfFile:jsonPath];

   

    NSString * str = [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];

   

    NSLog(@"%@",str);

   

   

    //2.解析

    NSError * error = nil;

   

    NSMutableArray  * arr = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

    //将字典或者字符串转换为JSON类型的

//    NSJSONSerializationdataWithJSONObject:<#(id)#> options:<#(NSJSONWritingOptions)#>error:<#(NSError **)#>

   

    NSLog(@"%@",arr);

   

   

    for (NSMutableDictionary * dic in arr) {

       

        Student * student = [[Studentalloc] init];

       

        student.name = [dic objectForKey:@"name"];

       

        student.sex = [dic objectForKey:@"sex"];

       

        student.number = [[dicobjectForKey:@"number"]intValue];

       

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

       

    }

 

0 0
原创粉丝点击