XML的解析方式
SAX
:IOS
上解析,速度快,内存占用小,只读DOM
:mac
上的解析方式,iOS
无法直接使用,解析过程中内存占用大,读写
SAX的解析步骤
加载xml
数据 -> 找开始节点(包括节点的属性) -> 找节点之间的内容 -> 找结束节点 -> 直到最后一个节点,解析结束
//加代理协议<NSXMLParserDelegate>
//NSURLConnection连接中返回的data
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
//设置代理,真正的解析在代理里面
parser.delegate = self;
//开始代理方法,开始解析
[parser parse];
//重写代理方法
//解析过程 解析的过程将其转为模型
Video对象
属性 name
属性 length
//1 开始解析文档
-(void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"start!");
};
//2 找开始节点
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
//elementName 节点名字
//attribute 标签的属性
if([elementName isEqualToString:@"video"])
{
self.currentVideo = [[Video alloc]init];
[self.videos addObject:self.currentVideo];
}
};
//3 节点之间的内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//拼接字符串
[self.mString appendString:string];
};
//4 找结束节点
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if(![elementName isEqualToString:@"video" && ![elementName isEqualToString:@"videos"]]){
//KVC记得property改copy,网络模型记得copy
[self.currentVideo setValue:self.mString forKey:elementName];
}
//记得清空
[self.mString setString:@""];
}
//5 结束解析文档
-(void)parserDidEndDocument:(NSXMLParser *)parser{
};
//6 解析出错
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
};
过程大概是
2 开始节点 video
2 开始节点 name
3 内容 勒布朗
3 内容 詹姆斯
4 结束节点 name
2 开始节点 length
3 内容 500
4 结束节点 length
DOM的解析步骤
DOM
方式的解析Document Object Model
,DOM
文档对象模型(文档模型)- 之前的
SAX
方式只能读取XML
,DOM
可以修改,添加删除节点 - iOS默认不支持
DOM
解析(不支持NSXML
这个类) - 一次性把
XML
全部加载到内存,内存消耗大,适合读写比较小的XML
文件 - 在OS解析DOM的话需要第三方框架
GData/KissXML
(XMPP
中使用此框架)
DOM的第三方框架GData/KissXML
- 需要根据头文件的要求配置
#import "GDataXMLNode.h"
//解析数据
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data error:NULL];
//获取XML文档的根元素(标签)
GDataXMLElement *rootElement = document.rootElement;
//对象集合
NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:10];
//遍历video节点
for(GDataXMLElement *element in rootElement.children){
//创建对象
Video *video = [[Video alloc]init];
//给对象的属性赋值
//遍历属性
for(GDataXMLNode *attr in element.attributes){
[video setValue:attr.stringValue forKey:attr.name];
}
//遍历子标签
for(GDataXMLElement *subElement in element.children){
[video setValue:subElement.stringValue forKey:subElement.name];
}
[mArray addObject:video];
}
//属性
{video type="mp4"}
//标签
{name}James{name/}
{length}500{length/}
{video/}