XML和解析
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];
}
}];
}
XML和解析的更多相关文章
- 通过正则表达式实现简单xml文件解析
这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...
- JAVA 中XML的解析
XML: 可扩展标记语言(extensible Markup Language) 用于标记电子文件使其具有结构性的标记语言.XML可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定 ...
- xml的解析与创建——bing到youdao导入文件的转换
首先是为了解决一个问题:如何将必应单词本中记录的单词转入到有道词典中去.实际上,必应词典可以导出xml文件,但是该文件有道词典无法解析.这里涉及到xml的解析和创建了. 代码如下: import ja ...
- iOS-数据持久化基础-JSON与XML数据解析
解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- iOS边练边学--iOS中的XML数据解析
XML的解析方式 SAX 大小文件都可以 NSXMLParser DOM 最好是小文件 GDataXML NSXMLParser的用法 创建解析器来解析 // 创建XML解析器 NSXMLParser ...
- 转 web项目中的web.xml元素解析
转 web项目中的web.xml元素解析 发表于1年前(2014-11-26 15:45) 阅读(497) | 评论(0) 16人收藏此文章, 我要收藏 赞0 上海源创会5月15日与你相约[玫瑰里 ...
- iOS - XML 数据解析
前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...
- xml数据解析调研
XML数据解析http://www.tuicool.com/articles/Nraau2(必用) http://www.cnblogs.com/pengyingh/articles/2342699. ...
- XML JSON解析--基本功能
一,json的解析 json文件: {"code": "cn","cities": [{"name": " ...
随机推荐
- android学习十三(android的通知使用)
通知(Notification)是android系统中比較有特色的一个功能,当某个应用程序希望向用户发出一些提示信息.而该应用程序又不在前台执行时,就能够借助通知来实现.发出一条通知后,手机最上方的状 ...
- Android 升级ADT到22第三方Jar包导致的ClassNotFoundException和NoClassDefFoundError异常解决
在使用异步载入框架Android-Universal-Image-Loader的Jar包的时候遇到错误: java.lang.NoClassDefFoundError:com.nostra13.uni ...
- nginx日志配置指令详解
这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下日志对于统计排错来说非常有利的.本文总结了nginx日 ...
- 设计模式中类的关系之依赖关系(Dependence)
依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系.可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的. ...
- Swoole系列(一):简介
前言: 实际上作为一名PHP程序员,我很清楚PHP的确有很多局限性,比如Unix系统编程.网络通信编程.异步io,大部分PHPer不懂.PHP界也确实没有这样的东西.Swoole开源项目就是为了弥补P ...
- 【转】Monkey测试2——Monkey测试策略
Monkey的测试策略 一. 分类 Monkey测试针对不同的对象和不同的目的采用不同的测试方案,首先测试的对象.目的及类型如下: 测试的类型分为:应用程序的稳定性测试和压力测试 测试对象分为:单一a ...
- OpenCV中的SURF算法介绍
SURF:speed up robust feature,翻译为快速鲁棒特征.首先就其中涉及到的特征点和描述符做一些简单的介绍: 特征点和描述符 特征点分为两类:狭义特征点和广义特征点.狭义特征点的位 ...
- Spring4 MVC+ AngularJS CRUD使用$http实例
这篇文章显示了使用Spring MVC4整合AngularJS.我们将创建一个使用后端和AngularJS作为前端的纯JSP封装Spring REST API一个CRUD应用程序, 使用 $http ...
- Python Socket 网络编程 (服务器端编程)
服务器端主要做以下工作: 打开 socket 绑定到特定的地址以及端口上 监听连接 建立连接 接收/发送数据 上面已经介绍了如何创建 socket 了,下面一步是绑定. 绑定 socket 函数 bi ...
- Win下httpd+php+mysql环境集成
apache+php+mysql: php下载: VC6就是legacy Visual Studio 6 compiler,就是使用这个编译器编译的, VC9就是the Visual Studio ...