iOS common parsing methods (XML, Json)


Two commonly used parsing methods in iOS use XML and Json


1. XML

XML: Extensible Markup Language (Extensible Markup Language ) , one of the mainstream data, can be used to store and transmit data 

Two XML parsing methods: SAX parsing, DOM parsing (one more PULL parsing in Android)


SAX parsing : (need to introduce < NSXMLParserDelegate>)

    simple API for XML is an event-based parsing method, which parses data line by line (using a protocol callback mechanism)


SAX specific usage

- (void)SexXmlAction {

    // simulate getting data from the network

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

    NSData *data = [NSDatadataWithContentsOfFile:path];

    

    // start parsing

        // 1. Create a parsing object and bind data

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

        // 2 , specify the proxy

    parser.delegate = self;

        // 3 , start parsing

    [parser parse];

    

    

}


// 4 , the method of implementing the proxy

// Start parsing the document

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

// NSLog(@" Start parsing the document ");

    

    self.data = [NSMutableArrayarray];

    

}


// Start parsing tags

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

// NSLog(@" Start parsing tags ");

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

        Person *p = [[Personalloc] init];

        [self.dataaddObject:p];

    }

    self.currentElement = elementName;

    self.tempString = [NSMutableStringstring];

}


// Parse the intermediate data item

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

// NSLog(@" parse intermediate data item ");

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

    [self.tempString appendString:string];

    

    

}


// end parsing tag

- (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);

    }

}



Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325770821&siteId=291194637