一 XML简介
XML曾经是最流行,出身名门,W3C主推,IBM,微软 是一门可拓展"标记语言"
- XML 键值对
<标记></标记>
<标记>标记内容</标记>
<标记 属性1="属性"属性2="属性2">标记内容</标记>
特点:
- 阅读方便,美观大方
二 解析方式
1 DOM MAC提供的解析方法,iOS中无法直接使用
- 原因:内存开销巨大!
- 可读可写
- 将数据已树形结构加载到内存
2 SAX iOS提供的解析方式
- 内存开销小
- 只读
- 速度快
- 从上到下,顺序解析的过程
- 读取到所需信息后可以随时停止
三 SAX解析的过程
1.打开文档(准备)
2.开始节点
<videos>
<video videoId="1">
<name>
<length>
3.发现节点内容(一个节点内容,可能会读取很多次!)
01.C
语言-
语法预览
320
....
4.结束节点
</name>
</length>
....
</video>
</videos> (最后一个节点) 判断文档是否解析结束,如果没有就继续
5.文档解析完成!
在实际开发中,XML的解析是用过NSXMLParser的对象来实现!具体的实现过程,是通过"五个代理"方法不断循环,来完成XML解析!
四 解析框架
1.苹果原生
NSXMLParser:SAX方式解析
五个代理方法
2.第三方框架
libxml2 :纯C语言的框架,默认是包容iOS SDK ,同时支持DM,SAX方法解析,
GDataXMLLDom 解析,基于libxml2
-
XML解析的思维导图
五 5个代理方法
#pragma mark --<XML解析代理方法>
//1.打开文档
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"1.开始文档");
//1.清空数组
[self.videos removeAllObjects];
}
//2.开始节点
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
//elementName 节点名称
//namespaceURI 命名空间
//qualifiedName 命名空间限定的本地名称
//attributes 属性
NSLog(@"2.开始节点 %@ %@",elementName,attributeDict);
if ([elementName isEqualToString:@"video"]) {
//1.新建模型
self.currentVideo = [[Video alloc]init];
//2设置videoID的属性
self.currentVideo.videoId = @([attributeDict[@"videoId"]intValue]);
}
}
//3.发现节点内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//拼接字符串
NSLog(@"==> %@",string);
[self.elementStr appendString:string];
}
//4.结束节点
/*
kvc
*/
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"4.结束节点:%@",elementName);
if ([elementName isEqualToString:@"video"]) {
[self.videos addObject:self.currentVideo];
}else if (![elementName isEqualToString:@"videos"])
{
[self.currentVideo setValue:self.elementStr forKey:elementName];
}
//清空字符串
[self.elementStr setString:@""];
}
//5.结束解析
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"5.结束解析!%@",self.videos);
}
//6.出现错误(主要是网络开发,就需要对出错进行处理)
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"发生错误");
}