iOS 常用解析方式(XML、Json)


在iOS中常用的两种解析方式使用XML、Json


一、 XML

XML:Extensible Markup Language(可扩展的标记语言),主流数据之一,可用来存储和传输数据 

XML 两种解析方式:SAX解析、DOM解析 (安卓中多一个PULL解析)


SAX解析 :(需要引入<NSXMLParserDelegate>)

    simple API for XML 基于事件机制的解析方式,采用逐行解析数据(采用协议回调机制)


SAX 具体用法

- (void)SexXmlAction {

    // 模拟从网络上拿到数据

    NSString *path = [[NSBundlemainBundle]pathForResource:@"message"ofType:@"txt"];

    NSData *data = [NSDatadataWithContentsOfFile:path];

    

    // 开始解析

        // 1创建解析对象,绑定数据

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

        // 2指定代理

    parser.delegate = self;

        // 3开始解析

    [parser parse];

    

    

}


// 4、实现代理的方法

// 开始解析文档

- (void)parserDidStartDocument:(NSXMLParser *)parser {

//    NSLog(@"开始解析文档");

    

    self.data = [NSMutableArrayarray];

    

}


// 开始解析标签

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

//    NSLog(@"开始解析标签");

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

        Person *p = [[Personalloc] init];

        [self.dataaddObject:p];

    }

    self.currentElement = elementName;

    self.tempString = [NSMutableStringstring];

}


// 解析中间数据项

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

//    NSLog(@"解析中间数据项");

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

    [self.tempString appendString:string];

    

    

}


// 结束解析标签

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

    Person *p = [self.datalastObject];

    

    // 利用KVC进行属性赋值

    [p setValue:self.tempStringforKey:self.currentElement];

//    NSLog(@"结束解析标签");

    self.currentElement =nil;

    self.tempString =nil;

}


// 结束解析文档

- (void)parserDidEndDocument:(NSXMLParser *)parser {

//    NSLog(@"结束解析文档");

    for (Person *pin self.data) {

        NSLog(@"%@ -- %@ -- %@",p.name, p.sex, p.info);

    }

}


// 文档出错之后

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {

    NSLog(@"OMG,文档有毒!!!!!");

}




DOM 解析

     * DOM -> document object model(文档对象模型)

     * 解析的时候,将文档整体的读入,并将XML结构化成树状,使用时,通过树枝来获取

     * DOM 解析方式比较好的一个实现是Google提供的GData,是开源的,他是对libxml.dylib的封装,也就是说需要导入类库

     *

    *

     第一步, 导入GData文件,配置环境文件,添加libxml2.tbd

     第二步, bulid setting Head Search Path 添加进入 ${SDK_ROOT}/usr/include/libxml2

     第三步, bulid phases 中第二个中 GData JSonKit 中添加 -fno-objc-arc (ARC MRC混编)(下面需要使用Json解析,同样也需要在同一个地方添加同样的语句, 因此都写在这里)

     *


DOM 具体用法

- (void)DomXmlAction {


    // 模拟从网络上拿到数据

    NSString *path = [[NSBundlemainBundle]pathForResource:@"message"ofType:@"txt"];

    NSData *data = [NSDatadataWithContentsOfFile:path];


    // 开始解析

        // 1创建解析对象

    GDataXMLDocument *doc = [[GDataXMLDocumentalloc] initWithData:data options:0error:nil];

        // 2拿到根节点

    GDataXMLElement *root = doc.rootElement;

        // 拿到子节点

    NSArray *modelArray = root.children;

        // 初始化data数组

    self.data = [NSMutableArrayarray];

    // 遍历数组取到每一个model对应的节点

    for (GDataXMLElement *modelElein modelArray) {

        Person *p = [[Personalloc] init];

        // 获得属性节点数组

        NSArray *proArray = modelEle.children;

        for (GDataXMLElement * proElein proArray) {

            [p setValue:proEle.stringValueforKey:proEle.name];

        }

        [self.dataaddObject:p];

        NSLog(@"%@--%@--%@", p.name, p.sex, p.info);

    }

}



二、Json解析

Javascript Object Notation (轻量级数据交换格式), 被称为理想的数据交换语言
在Son中只有两种东西:对象、数据

#pragma  mark---------- 使用jsonKit 进行解析 (使用第三方)


- (void)JSONKitAction {

    

    // 模拟从网络上获取数据

    NSString *path = [[NSBundlemainBundle]pathForResource:@"Json"ofType:@"txt"];

    NSData *data = [NSDatadataWithContentsOfFile:path];

    

    //1 直接从data中拿对象

    NSArray *array = [data objectFromJSONData];

    //2 初始化数组

    self.data = [NSMutableArrayarray];

    //3 遍历数组

    for (NSDictionary *dicin array) {

        Person *p = [[Personalloc] init];

        

        [p setValuesForKeysWithDictionary:dic];

        [self.dataaddObject:p];

    }

    // 循环打印,查看结果

    for (Person *pin self.data) {

        NSLog(@"%@-- %@ -- %@",p.name, p.sex, p.info);

    }

    

}


#pragma  mark---------- 利用系统提供的类进行JSON解析

- (void)JsonSerializationActoin {

    

    // 模拟从网络上获取数据

    NSString *path = [[NSBundlemainBundle]pathForResource:@"Json"ofType:@"txt"];

    NSData *data = [NSDatadataWithContentsOfFile:path];


    NSArray *array = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingAllowFragmentserror:nil];

    

    self.data = [NSMutableArrayarray];

    for (NSDictionary *dicin array) {

        Person * p = [[Personalloc] init];

        [p setValuesForKeysWithDictionary:dic];

        [self.dataaddObject:p];

    }

    for (Person *pin self.data) {

        NSLog(@"%@-- %@ -- %@",p.name, p.sex, p.info);

    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值