iOS中XML解析分為兩種實現方式:SAX與DOM
SAX方式:主要是事件驅動的解析方式,是逐行讀取XML數據,不斷回調代理,告訴代理當前解析的元素開始或者結束。
DOM解析方式:是講整個XML數據全部讀入內存,然后形成一顆樹形結構,再根據元素的名稱來讀取相關的屬性。
優缺點:
(1)SAX解析適合大型文件解析,對內存占用比較小,但是解析是采用事件驅動方式,因此代碼比較零散復雜。
(2)DOM解析方式適合小型文件解析,代碼實現非常簡單,基本是按照元素名稱來索引相關的屬性。但是在解析大型文件的時候,由于是將XML數據全部讀入內存,因此內存占用比較大。
1.下面首先介紹簡單的DOM解析方式:使用google開源的GDataXML開源框架。
// 解析XML數據
// 加載整個XML數據GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];// 獲得文檔的根元素 -- videos元素GDataXMLElement *root = doc.rootElement;// 獲得根元素里面的所有video元素NSArray *elements = [root elementsForName:@"video"];// 遍歷所有的video元素for (GDataXMLElement *videoElement in elements) {HMVideo *video = [[HMVideo alloc] init];// 取出元素的屬性video.id = [videoElement attributeForName:@"id"].stringValue.intValue;video.length = [videoElement attributeForName:@"length"].stringValue.intValue;video.name = [videoElement attributeForName:@"name"].stringValue;video.image = [videoElement attributeForName:@"image"].stringValue;video.url = [videoElement attributeForName:@"url"].stringValue;// 添加到數組中[self.videos addObject:video];}
2.使用SAX方式解析XML數據使用的是蘋果自帶的解析框架NSXMLParser框架
// 解析XML數據
// 1.創建XML解析器 -- SAX -- 逐個元素往下解析NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];// 2.設置代理parser.delegate = self;// 3.開始解析(同步執行)[parser parse];
pragma mark - NSXMLParser的代理方法–
/**
* 解析到文檔的開頭時會調用
*/
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
// NSLog(@”parserDidStartDocument—-“);
}
/**
* 解析到一個元素的開始就會調用
*
* @param elementName 元素名稱
* @param attributeDict 屬性字典
*/
- (void)parser:(NSXMLParser )parser didStartElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName attributes:(NSDictionary *)attributeDict
{
if ([@”videos” isEqualToString:elementName]) return;
HMVideo *video = [HMVideo videoWithDict:attributeDict];
[self.videos addObject:video];
}
/**
* 解析到一個元素的結束就會調用
*
* @param elementName 元素名稱
*/
- (void)parser:(NSXMLParser )parser didEndElement:(NSString )elementName namespaceURI:(NSString )namespaceURI qualifiedName:(NSString )qName
{
// NSLog(@”didEndElement—-%@”, elementName);
}
/**
* 解析到文檔的結尾時會調用(解析結束)
*/
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
// NSLog(@”parserDidEndDocument—-“);
}