您的位置:首页 > 理论基础 > 计算机网络

XML和解析

2015-10-15 11:26 525 查看
XML和解析

1.什么是XML?

Extensible Markup Language,可扩展标记语言。

一般也叫XML文档。

和JSON一样,也是常用的一种用于交互的数据格式。

2.XML语法

1)一个常见的XML文档一般由以下部分组成

1>文档声明:

在XML最前面,必须编写一个文档声明,用来声明XML文档的类型。

最简单的声明如:<?xml version='1.0'?>

2>元素(Element)

一个元素包括了开始标签和结束标签。<video>little yellow mn</video>

一个元素可以嵌套若干个子元素(不能出现交叉嵌套)。

注意:XML中的所有换行、空格都是字符,会当作具体内容。

3>属性(Attribute)

一个属性可以拥有多个属性。

属性值必须用双引号“”或者单引号‘’括住。

实际上,属性表示的信息也可以用子元素来表示。

3.XML解析

解析方式有两种:

DOM:一次性将整个XML文档以树形结构加载进内存,内存消耗大,比较适合解析小文件。在iOS开发中默认不支持DOM方式解析。

SAX:从根元素开始,按顺序一个元素一个元素往下解析,性能好,比较适合解析大文件。苹果推荐使用。

1)苹果原生

NSXMLParser:SAX方式解析,使用简单。

2)第三方框架

libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析。

GDataXML:DOM方式解析,由Google开发,基于libxml2.

KissXML:DOM方式解析。

3)XML解析方式的选择建议

大文件:NSXMLParser,libxml2

小文件:GDataXML

4.代码示例

-(void)loadData

{
//1.url
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/video.xml"];
//2.请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.连接
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError){
//xml的解析
//1.实例化一个xml的解析器,通过代理来实现xml的解析
NSXMLParser *parse = [[NSXMLParser alloc] initWithData:data];
//2.设置代理
parse.delegate = self;
//3.解析器开始解析
[parse parse];
}];

}

/*代理方法*/

/*1.打开文档,准备开始解析*/

-(void)parserDidStartDocument:(NSXMLParser *)parser

{
//初始化数组容器,清空容器,便于多次加载数据
[self.vedio removeAllObjects];

}

/*2.开始节点*/

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

{
//如果开始节点名称是video,就创建一个对象
if([elementName isEqualToString:@"video"]){
self.currentVideo = [[Video alloc] init];
//设置videoID
self.currentVideo.videoId = attributeDict[@"videoId"];
}
//清空字符串的内容,因为马上需要进入第三步,要开始拼接当前的节点的内容
[self.elementString setString:@""];

}

/*3.发现节点里面的内容*/

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

{
//开始拼接
[self.elementString appendString:string];

}

/*4.结束节点*/

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

{
if([elementName isEqualToString:@"video"]){
//如果结束的节点是video,需要把这个对象添加到数组
[self.video addObject:self.currentVideo];
//如果节点结束,就可以把第二步创建的对象,设置name/length属性
else if([elementName isEqualToString:@"name"]){
//设置name
//1.直接赋值
self.currentVideo.name = self.elementString;
//2.KVC赋值
[self.currentVideo setValue:self.elementString forKey:@"name"];
//3.改造
[self.currentVideo setValue:self.elementString forKey:elementName];
}else if([elementName isEqualToString:@"length"]){
//设置length
self.currentVideo.length = @([self.elementString integerValue]);
}else if([elementName isEqualToString:@"desc"]){
//设置desc
self.currentVideo.desc = self.elementString;
}

//KVC改进上面的赋值代码

}

/*5.结束文档*/

-(void)parserDidEndDocument:(NSXMLParser *)parser

{
//xml真正解析结束,可以更新UI
dispatch_async(dispatch_get_main_queue(), ^{
//将容器里的数据(self.videos)赋值给表格显示数据
self.dataList = self.videos;
});

}

5.注意点

使用NSNumber防止服务器端返回null,在KVC赋值的时候程序崩溃。

NSNumber *id;是可以使用的,不会导致程序崩溃。

6.GDataXML使用

1)根据报错地方的提示操作,消除错误。

2)代码

-(void)loadData

{
//1.url
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/video.xml"];
//2.请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.连接
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError){
//将XML整个读入内存
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data error:NULL];
for(GDataXMLElement *element in document.rootElement.children){
//创建video对象
Video *video = [[Video alloc] init];
for(GDataXMLElement *node in element.children){
NSLog(@"%@,%@", node.name, node.stringValue);
//KVC赋值
[video setValue:node.stringValue forKey:node.name];
}
NSLog(@"%@", element.attributes);
//遍历element.attributes数组,拿到属性值
for(GDtatXMLNode *att in element.attributes){
//KVC赋值
[video setValue:att.stringValue forKey:att.name];
}
//模型添加到数组
[self.videos addObject:video];
}
}];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息