什么是XML?
XML全称Extentsible Markup Language 又叫可扩展标记语言
HTML是超文本标记语言,什么是标记语言通俗易懂点就是有<tag></tag>这个的就是可标记语言
XML尖括号中的内容是可以随便写的,所有XML可扩展,而HTML中的尖括号是预定义的
XML和HTML很类似,HTML的作用就是显示数据,XML的目的是存储和传输数据。
XML文档一般由三部分组成,文档声明,元素,还有属性。
文档声明可以这么写<?xml version="1.0" ?>
也可以这么写<?xml version="1.0" encoding="UTF-8" ?> encoding属性就是说明了文档的字符编码
一个元素包括了开始标签和结束的标签,可以这么写
<name>哈哈</name>
<name></name>
<name/>
一个元素可以嵌套着若干个元素,但是不能出现交叉嵌套的情况
XML的所有的空格和换行都会当做具体的内容处理
比如说<name>哈哈</name>
和<name>
哈哈
</name>是不一样的
一个元素可以有多个属性
XML是之前各种应用之间传输数据最常用的格式
XML中有且只有一个根节点
XML可以这么写
<!-- 注释 -->
<Class className="计算机">
<Student name="hh" sex="boy" />
</Class>
XML的解析方式一种是SAX,速度快,只读,加载一部分,解析一部分,基于事件驱动
是指一种基于回调(callback)机制的程序运行方法
SAX的解析步骤是
加载xml数据
找开始节点(包括节点的属性)
找节点之间的内容
找结束节点
直到找到最后一个节点,解析结束。
总结来说就是1、开始文档 2、开始节点 3、发现节点的内容 4、结束节点 5、解析结束
SAX解析方式代码如下
#import "ViewController.h"
@interface ViewController ()<NSXMLParserDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self loadXML];
}
-(void)loadXML
{
NSURL * url=[NSURL URLWithString:@"http://127.0.0.1/File.xml"];
NSURLRequest * request=[NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if(connectionError)
{
NSLog(@"连接错误 %@",connectionError);
return;
}
//获取服务器的响应体,如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码。简单的表达就是:客户端已经执行了GET,但文件未变化。然后直接从缓存中读取,状态码为200表示成功处理了请求,404 服务器找不到请求的网页
//connection是判断是否和服务器连接成功,是发送数据之前的事情
//响应头中的Content-Type代表的是服务器告诉浏览器我发给你的是什么文件
//这里的response实际上是NSURLResponse的子类,所以我们强制转换下
NSHTTPURLResponse * httpResponse=(NSHTTPURLResponse *)response;
//判断下status code的编码
if(httpResponse.statusCode == 200 || httpResponse.statusCode == 304)
{
//解析xml数据
NSXMLParser * parser=[[NSXMLParser alloc]initWithData:data];
//设置代理
parser.delegate=self;
//开始执行代理的方法,代理的方法中开始解析,是同步执行的
[parser parse];
}
else
{
NSLog(@"服务器内部错误");
}
}];
}
//代理方法的执行的线程是在和设置代理属性的线程是同一个线程
//1、开始解析文档
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"开始解析文档");
}
//2、找开始节点
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
//elementName 节点的名称
//attributeDict 标签的属性
NSLog(@"找开始节点 %@ %@",elementName,attributeDict);
}
//3、找节点之间的内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"找节点之间的内容 %@",string);
}
//4、找结束节点
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//elementName 节点的名称
NSLog(@"找结束节点 %@",elementName);
}
//5、结束解析文档
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"结束解析文档");
}
//6、解析出错
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"解析出错");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
还有一种解析方式是DOM方式的解析全称Document Object Model
DOM-又叫文档对象模型,就是把整个文档视为对象,解析文档前,全部加载,转化为树模型
一次性把XML全部加载到内存中,内存消耗大
SAX方法只能读取XML,DOM可以修改、添加和删除某个节点
ios默认不支持DOM解析
DOM适合读写比较小的XML文件
DOM解析我们可以用一个第三方框架GData