一 XML簡介
XML曾經是最流行,出身名門,W3C主推,IBM,微軟 是一門可拓展"標記語言"
- XML 鍵值對
<標記></標記>
<標記>標記內容</標記>
<標記 屬性1="屬性"屬性2="屬性2">標記內容</標記>
特點:
- 閱讀方便,美觀大方
二 解析方式
1 DOM MAC提供的解析方法,iOS中無法直接使用
- 原因:內存開銷巨大!
- 可讀可寫
- 將數(shù)據(jù)已樹形結構加載到內存
2 SAX iOS提供的解析方式
- 內存開銷小
- 只讀
- 速度快
- 從上到下,順序解析的過程
- 讀取到所需信息后可以隨時停止
三 SAX解析的過程
1.打開文檔(準備)
2.開始節(jié)點
<videos>
<video videoId="1">
<name>
<length>
3.發(fā)現(xiàn)節(jié)點內容(一個節(jié)點內容,可能會讀取很多次!)
01.C
語言-
語法預覽
320
....
4.結束節(jié)點
</name>
</length>
....
</video>
</videos> (最后一個節(jié)點) 判斷文檔是否解析結束,如果沒有就繼續(xù)
5.文檔解析完成!
在實際開發(fā)中,XML的解析是用過NSXMLParser的對象來實現(xiàn)!具體的實現(xiàn)過程,是通過"五個代理"方法不斷循環(huán),來完成XML解析!
四 解析框架
1.蘋果原生
NSXMLParser:SAX方式解析
五個代理方法
2.第三方框架
libxml2 :純C語言的框架,默認是包容iOS SDK ,同時支持DM,SAX方法解析,
GDataXMLLDom 解析,基于libxml2
-
XML解析的思維導圖
xml 解析思維導圖.png
五 5個代理方法
#pragma mark --<XML解析代理方法>
//1.打開文檔
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
NSLog(@"1.開始文檔");
//1.清空數(shù)組
[self.videos removeAllObjects];
}
//2.開始節(jié)點
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
//elementName 節(jié)點名稱
//namespaceURI 命名空間
//qualifiedName 命名空間限定的本地名稱
//attributes 屬性
NSLog(@"2.開始節(jié)點 %@ %@",elementName,attributeDict);
if ([elementName isEqualToString:@"video"]) {
//1.新建模型
self.currentVideo = [[Video alloc]init];
//2設置videoID的屬性
self.currentVideo.videoId = @([attributeDict[@"videoId"]intValue]);
}
}
//3.發(fā)現(xiàn)節(jié)點內容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//拼接字符串
NSLog(@"==> %@",string);
[self.elementStr appendString:string];
}
//4.結束節(jié)點
/*
kvc
*/
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"4.結束節(jié)點:%@",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.出現(xiàn)錯誤(主要是網絡開發(fā)冯吓,就需要對出錯進行處理)
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"發(fā)生錯誤");
}