IOS开发之网络篇第一章:数据交换格式

Posted 长命百岁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS开发之网络篇第一章:数据交换格式相关的知识,希望对你有一定的参考价值。

网络通信最常用的数据通信格式是xml和Json,各有各的好处,不管怎样,这种的格式,我们在开发的过程中经常使用的,现在就这两种格式进行记录笔记,以下内容不做详细分析,只针对如何应用各种读写工具进行对xml和json内容的操作

xml

解析XML文件现在有两种主流的,SAX和DOM

  • SAX-基于时间事件驱动,意思就是读取的过程中,是由上往下的读取xml文件,当遇到节点的时候,触发相应的事件,使用上比较快,缺点是不能修改文件内容
  • DOM-以树状形式加载,加载后存放在内存当中,所以如果文件大,读取的时间就会比较长,但是可修改文件

ios的SDK提供了两个框架,还有些第三方框架,这里只介绍2种NSXML和TBXML

  • NSXML-它是用Object-C语言编写,只支持SAX解析框架
  • libxml2
  • TBXML-使用DOM的解析框架(据说很快,有时间测试一下)
  • TouchXML
  • KissXML
  • TinyXML
  • GDataXML

现在有一个xml文件,现在通过NSXML方式来读取,我们另外写了一个类,用于读写xml的

第一种介绍的是NSXML

NodeText.xml

<?xml version="1.0" encoding="UTF-8"?>
<Notes>
    <Note id="1"> 
   <Name>8点??到????</Name> 
   <UserID>tony</UserID>
    </Note>
    <Note id="1"> 
   <Name>8点??到????</Name> 
   <UserID>tony</UserID>
    </Note>
</Notes>        

 

下面的这个类是是用作读写XML用的,必须使用委托NSXMLParserDelegate,这里有两个方法,一个是初次化initWithURL:需要提供文件地址,另外一个方法是parser,这个方法就是开始解析xml文件的入口

XMLReader.h文件

#import <Foundation/Foundation.h>

@interface XmlReader : NSObject<NSXMLParserDelegate>

@property(nonatomic)NSMutableDictionary *dict;

-(id)initWithURL:(NSURL *)url;

-(void)parser;

@end

 

具体的实现如下

XMLReader.m,NSXMLParserDelegate委托包含很多个方法可以,这里主要复写了以下几个方法

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

    •   当文档开始的时候会调用,只读一次
  • - (void)parserDidEndDocument:(NSXMLParser *)parser

    •   当文档解析结束的时候调用,只读一次
  • - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict

    •   当节点开始的时候调用
  • -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

    •   当节点结束的时候调用
  • -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

    •   当读取到节点里面的字符串的时候调用
@interface XmlReader()
@property(nonatomic)NSURL *url;
@end

@implementation XmlReader

-(id)initWithURL:(NSURL *)url
{
    
    self = [super init];
    if (self) {
        self.url = url;
        
    }
    return self;
}

-(void)parser
{
    NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:self.url];
    parser.delegate = self;
    BOOL b = [parser parse];
}


- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    self.dict = [[NSMutableDictionary alloc]init];
}
// sent when the parser begins parsing of the document.
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict
{
    
    NSLog(@"%@",elementName);
}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"%@",string);
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"%@",elementName);
}

@end

 

第二种介绍的是TBXML

这个是一个第三方提供的读取方式,所以需要导入代码工程,可以到https://github.com/71squared/TBXML下载源码,下载的zip包或者hub同步下载,我使用的是下载zip包,下载好后解压,会得到一大堆文件,但这里只需要提取TBXML.h和TBXML.m文件即可,把他们考到工程里面,直接使用即可。根据一些网上有些不同的经验之谈,有的因不支持ARC机制,而报的错,有的是因为工程没有导入libz.dylib包而出错,不管怎样,没有包的直接导入就行,不支持ARC就找找网络的文章就可以解决,我这里出现了另外一个情况,就是TBXML.h文件少导入了fundation包,所以导致报错了,没有找到NSObject

这些都配置好后,就可以使用了,这里我写了另外的一个类,用作读取信息xml用的,代码如下

XmlReaderTBXML.h文件

#import <Foundation/Foundation.h>
#import "TBXML.h"

@interface XmlReaderTBXML : NSObject

@property (strong,nonatomic) NSMutableArray *notes;

//开始解析方法
-(void)start;

@end

 

XmlReaderTBXML.h文件

#import "XmlReaderTBXML.h"

@implementation XmlReaderTBXML


-(void)start
{
    self.notes = [[NSMutableArray alloc]init];
    
    TBXML *tbxml = [[TBXML alloc]initWithXMLFile:@"NodeTest.xml" error:nil];
    
    TBXMLElement * root = tbxml.rootXMLElement;
    if (root) {
        TBXMLElement * noteElement = [TBXML childElementNamed:@"Note"
                                                parentElement:root];
        while ( noteElement != nil) {
            NSMutableDictionary *dict = [NSMutableDictionary new];
            TBXMLElement *CDateElement = [TBXML childElementNamed:@"CDate" parentElement:noteElement];
            if ( CDateElement != nil) {
                NSString *CDate = [TBXML textForElement:CDateElement];
                [dict setValue:CDate forKey:@"CDate"];
            }
            TBXMLElement *ContentElement = [TBXML childElementNamed:@"Content" parentElement:noteElement];
            if ( ContentElement != nil) {
                NSString *Content = [TBXML textForElement:ContentElement];
                [dict setValue:Content forKey:@"Content"];
            }
            TBXMLElement *UserIDElement = [TBXML childElementNamed:@"UserID" parentElement:noteElement];
            if ( UserIDElement != nil) {
                NSString *UserID = [TBXML textForElement:UserIDElement];
                [dict setValue:UserID forKey:@"UserID"];
            }
            //ID属性
            NSString *_id = [TBXML valueOfAttributeNamed:@"id" forElement:noteElement error:nil];
            [dict setValue:_id forKey:@"id"];
            [_notes addObject:dict];
            noteElement = [TBXML nextSiblingNamed:@"Note" searchFromElement:noteElement];
            
        }
        
    }
    NSLog(@"解析完成...");
   
    self.notes = nil;
}
@end

在这个start方法中就是读取xml的过程,非常简单,就不作介绍了

 

 

JSON

Json是一个轻量级的数据交换格式

以上是关于IOS开发之网络篇第一章:数据交换格式的主要内容,如果未能解决你的问题,请参考以下文章

2016.6.6 计算机网络考试要点第一章之网络体系结构

计算机网络第一章课后答案

第一章 计算机网络和因特网

计算机网络第一章 计算机网络概述

计算机网络第一章 计算机网络概述

iOS开发之JSON格式数据的生成与解析