ios-XML浅析

来源:互联网 发布:验机软件 编辑:程序博客网 时间:2024/06/07 01:23

什么是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

原创粉丝点击