亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

IOS解析XML文檔

2019-11-14 20:04:01
字體:
來源:轉載
供稿:網友

      前段時間想找點事做,就是試著看能不能用豆瓣的API做點什么,于是就碰到了這個問題——xml解析。

  老師還沒講,只能自己去查。

    XML文檔解析主要有SAX和DOM兩種模式,IOS上兩種模式都可以用,這里就不做過多介紹,我選擇的SAX模式。

        IOS解析XML用的是自帶的NSXML框架,框架的核心是NSXMLParser類和它的委托協議NSXMLParserDelegate,其主要的解析工作是在NSXMLParserDelegate實現類中完成的。委托中定義了許多回掉方法,在SAX解析器從上到下遍歷XML文檔的過程中,遇到開始標簽、結束標簽、文檔開始、文檔結束和字符串結束是就會觸發這些方法。這些方法有很多,下面我們列出5個常用的方法。

     在文檔開始時觸發

 -(void)parserDidStartDocument:(NSXMLParser *)parser      

   遇到一個新標簽是觸發,其中namespaceURI是命名空間,qualifiedName是限定名,attributes是字典類型的屬性集合。

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 

  找到字符串時觸發                                   

    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

  遇到結束標簽時觸發

    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 

  在文檔結束時觸發

-(void)parserDidEndDocument:(NSXMLParser *)parser         

    下面通過一個具體的例子來看整個的調用與解析過程

    首先這是我們將要解析的XML文件 "info.xml"

    ?    ?    ?<?xml version="1.0" encoding="UTF-8"?>    ?    ?    ?<root>  ?    ?    ?    ?    ?    ? <person id="1">    ?    ?    ?    ?    ? <firstName>Wythe</firstName>   ?    ?    ?    ?    ?    ?    ?    ?    ?    ? <lastName>xu</lastName>   ?    ?    ?    ?    ?    ?    ?    ?    ?    ? <age>22</age>  ?    ?    ?    ?    ?    ?    ?    ? </person>  ?    ?    ?   ?    ?    ?    ? <person id="2">   ?    ?    ?    ?    ?    ?    ?    ?    ? <firstName>li</firstName>    ?    ?    ?    ?    ?    ?    ?    ?    ?    ? <lastName>si</lastName>    ?    ?    ?    ?    ?    ?    ?    ?    ?    ? <age>31</age>  ?    ?    ?    ?    ?    ?    ?    ? </person>    ?    ?    ?    ?    ?    ?    ?    ?    ?<person id="3">   ?    ?    ?    ?    ?        ?    ?    ?    ?    ? <firstName>Dipen</firstName>    ?    ?    ?    ?    ?        ?    ?    ?    ?    ? <lastName>Shah</lastName>    ?    ?    ?    ?    ?        ?    ?    ?    ?    ? <age>24</age>    ?    ?    ?    ?        ?    ?    ?    ? </person>    ?    ?    ?    ?    ?    ?    ?</root>

 

接來來是一個頭文件 "ViewController.h"

#import <UIKit/UIKit.h>@interface ViewController : UIViewController<NSXMLParserDelegate>@PRoperty NSXMLParser *parser;@property NSMutableArray *person;@property NSString *currenttag;@end

然后是它的實現文件  "ViewController.m"

#import "ViewController.h"@interface ViewController ()@end@implementation ViewController@synthesize  parser = _parser , person = _person , currenttag = _currenttag;- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];    if (self) {        // Custom initialization    }    return self;}- (void)viewDidLoad{    [super viewDidLoad];        NSString *xmlFilePath = [[NSBundle mainBundle]pathForResource:@"info"ofType:@"xml"];        NSData *data = [[NSData alloc]initWithContentsOfFile:xmlFilePath];        self.parser = [[NSXMLParser alloc]initWithData:data];        self.parser.delegate = self;        [self.parser parse];        NSLog(@"%@",_person);    }- (void)didReceiveMemoryWarning{    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}#pragma mark delegate method-(void)parserDidStartDocument:(NSXMLParser *)parser{    _person = [[NSMutableArray alloc]init];    NSLog(@"start parse 1");}-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    _currenttag = elementName;        if ([_currenttag isEqualToString:@"person"]) {        NSString *_id = [attributeDict objectForKey:@"id"];        NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];        [dict setObject:_id forKey:@"id"];        [_person addObject:dict];    }        NSLog(@"start element");}-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{    NSMutableDictionary *dict = [_person lastObject];        if ([_currenttag isEqualToString:@"firstName"] && dict) {        [dict setObject:string forKey:@"firstName"];    }    if ([_currenttag isEqualToString:@"lastName"] && dict) {        [dict setObject:string forKey:@"lastName"];    }    if ([_currenttag isEqualToString:@"age"] && dict) {        [dict setObject:string forKey:@"age"];    }        NSLog(@"found characters");}-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{    _currenttag = nil;        NSLog(@"end element");}-(void)parserDidEndDocument:(NSXMLParser *)parser{    NSLog(@"parse end");}@end

 

通過斷電和輸出信息,我們可以知道整個解析過程是 開始解析文檔、開始標簽、找到字符串、結束標簽、文檔結束。

2014-09-10 16:45:32.920 xmlforblog[3820:60b] start parse 12014-09-10 16:45:32.921 xmlforblog[3820:60b] start element2014-09-10 16:45:32.922 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.922 xmlforblog[3820:60b] start element2014-09-10 16:45:32.922 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.922 xmlforblog[3820:60b] start element2014-09-10 16:45:32.923 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.923 xmlforblog[3820:60b] end element2014-09-10 16:45:32.923 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.923 xmlforblog[3820:60b] start element2014-09-10 16:45:32.924 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.924 xmlforblog[3820:60b] end element2014-09-10 16:45:32.924 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.924 xmlforblog[3820:60b] start element2014-09-10 16:45:32.925 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.925 xmlforblog[3820:60b] end element2014-09-10 16:45:32.925 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.925 xmlforblog[3820:60b] end element2014-09-10 16:45:32.926 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.926 xmlforblog[3820:60b] start element2014-09-10 16:45:32.928 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.929 xmlforblog[3820:60b] start element2014-09-10 16:45:32.929 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.929 xmlforblog[3820:60b] end element2014-09-10 16:45:32.930 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.930 xmlforblog[3820:60b] start element2014-09-10 16:45:32.930 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.930 xmlforblog[3820:60b] end element2014-09-10 16:45:32.931 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.931 xmlforblog[3820:60b] start element2014-09-10 16:45:32.931 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.931 xmlforblog[3820:60b] end element2014-09-10 16:45:32.931 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.932 xmlforblog[3820:60b] end element2014-09-10 16:45:32.932 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.932 xmlforblog[3820:60b] start element2014-09-10 16:45:32.932 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.933 xmlforblog[3820:60b] start element2014-09-10 16:45:32.933 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.933 xmlforblog[3820:60b] end element2014-09-10 16:45:32.933 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.934 xmlforblog[3820:60b] start element2014-09-10 16:45:32.934 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.934 xmlforblog[3820:60b] end element2014-09-10 16:45:32.934 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.935 xmlforblog[3820:60b] start element2014-09-10 16:45:32.935 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.935 xmlforblog[3820:60b] end element2014-09-10 16:45:32.935 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.936 xmlforblog[3820:60b] end element2014-09-10 16:45:32.936 xmlforblog[3820:60b] found characters2014-09-10 16:45:32.936 xmlforblog[3820:60b] end element2014-09-10 16:45:32.936 xmlforblog[3820:60b] parse end2014-09-10 16:45:32.936 xmlforblog[3820:60b] (        {        age = 22;        firstName = Wythe;        id = 1;        lastName = xu;    },        {        age = 31;        firstName = li;        id = 2;        lastName = si;    },        {        age = 24;        firstName = Dipen;        id = 3;        lastName = Shah;    })
執行結果

 

而我們的處理主要是在 開始標簽、找到字符串 (

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

中。

遇到開始標簽時,我們現判斷標簽,名字,如果是person,表明接下來就是person的信息,這樣我們就先創建一個可變字典,以便將來存放它的值。

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    _currenttag = elementName;        if ([_currenttag isEqualToString:@"person"]) {        NSString *_id = [attributeDict objectForKey:@"id"];        NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];        [dict setObject:_id forKey:@"id"];        [_person addObject:dict];    }        NSLog(@"start element");}

在找到字符串時,我們就是通過判斷當前標簽名,將對應的信息保存到剛剛創建的字典中

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{    NSMutableDictionary *dict = [_person lastObject];        if ([_currenttag isEqualToString:@"firstName"] && dict) {        [dict setObject:string forKey:@"firstName"];    }    if ([_currenttag isEqualToString:@"lastName"] && dict) {        [dict setObject:string forKey:@"lastName"];    }    if ([_currenttag isEqualToString:@"age"] && dict) {        [dict setObject:string forKey:@"age"];    }        NSLog(@"found characters");}

 不斷循環這樣的過程,最后我們就可以解析出整個XML文檔。

 另外說一句,這只是解析一般的文檔,如果你跟我曾經一樣學會這個就去解析豆瓣API的XML文檔,會發現行不通。這時因為許多網站因為它的數據較多,為了避免標簽的重復,使用了命名空間,帶有命名空間的XML文檔解析和這稍有不同。

 以后我會寫帶命名空間的XML文檔解析,敬請期待。

 

 拖了快一個月了,今天終于寫完。以后不能這么懶了                                     

    ? 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品中文在线| 97国产精品视频| 中文字幕免费精品一区高清| 国产aaa精品| 97视频在线观看亚洲| 日本国产一区二区三区| 久久中文久久字幕| 国产欧美在线视频| 久久久久久久影院| 精品国产31久久久久久| 国产精品羞羞答答| 国产精品爽爽ⅴa在线观看| 亚洲欧美国产va在线影院| 成人av资源在线播放| 欧美成年人在线观看| 日韩在线观看精品| 日韩av黄色在线观看| 亚洲精品电影久久久| 91精品国产乱码久久久久久蜜臀| 91理论片午午论夜理片久久| 日本精品久久久久久久| 欧美色道久久88综合亚洲精品| 亚洲free性xxxx护士hd| 高清一区二区三区日本久| 亚洲品质视频自拍网| 欧美电影免费观看高清| 国产精品九九九| 欧美激情一区二区久久久| 992tv在线成人免费观看| 亚洲精品乱码久久久久久按摩观| 久久影院在线观看| 欧美另类精品xxxx孕妇| 日韩女在线观看| 日韩精品在线观| 日韩av综合网站| 国产成人精品a视频一区www| 亚洲天堂第一页| 亚洲黄一区二区| 中文字幕视频在线免费欧美日韩综合在线看| 国产成人精品一区| 亚洲综合视频1区| 国产精品大陆在线观看| 91精品久久久久久久久青青| 成人欧美一区二区三区黑人| 亚洲国产精品成人一区二区| 2019中文字幕全在线观看| 国产一级揄自揄精品视频| 91九色国产社区在线观看| 欧美亚洲第一页| 福利视频第一区| 亚洲国产成人精品一区二区| 亚洲伊人久久大香线蕉av| 91精品在线播放| 亚洲精品成人久久电影| 一本一本久久a久久精品牛牛影视| 性欧美暴力猛交69hd| 欧美资源在线观看| 色婷婷成人综合| 日韩视频免费中文字幕| 在线电影av不卡网址| 亚洲国产精品va在线看黑人动漫| 中文字幕欧美国内| 欧美一级视频在线观看| 国产精品无码专区在线观看| 91精品中文在线| 久久久成人精品| 日韩免费视频在线观看| 欧美国产激情18| 中文字幕亚洲第一| 亚洲人成在线免费观看| 久久精品国产96久久久香蕉| 久久97精品久久久久久久不卡| 国产高清在线不卡| 操人视频在线观看欧美| 26uuu日韩精品一区二区| 欧美视频在线视频| 日韩高清电影免费观看完整版| 亚洲最新av在线| 狠狠躁夜夜躁久久躁别揉| 欧美成人精品一区二区三区| 国产精品久久久久久亚洲调教| 亚洲精品成人av| 国产精品视频久久久久| 国产精品国语对白| 97不卡在线视频| 欧美精品久久久久久久久久| 欧美日本精品在线| 亚洲午夜激情免费视频| 久久久国产精品视频| 91精品国产综合久久香蕉922| 久久中国妇女中文字幕| 久久久久久久久久久免费精品| 97香蕉久久夜色精品国产| 亚洲最新视频在线| 8090理伦午夜在线电影| 久久久久国色av免费观看性色| 亚洲电影天堂av| 欧美裸体视频网站| 欧美日韩亚洲91| 青青a在线精品免费观看| 国产精品久久久久999| 91精品国产高清久久久久久| 日韩电影免费观看在线观看| 亚洲精品在线看| 超碰精品一区二区三区乱码| 草民午夜欧美限制a级福利片| 亚洲欧美激情四射在线日| 性欧美xxxx交| 97精品久久久中文字幕免费| 一个人看的www久久| 日韩中文av在线| 国产精品美女久久久久久免费| 日韩中文字幕亚洲| 91亚洲永久免费精品| 亚洲欧洲中文天堂| 亚洲免费小视频| 欧美刺激性大交免费视频| 欧洲成人免费aa| 中文字幕亚洲第一| 欧美黄色片免费观看| 国产精品久久不能| 欧美日韩免费在线观看| 久久欧美在线电影| 91精品国产91久久久久福利| 久久高清视频免费| 亚洲片国产一区一级在线观看| 欧美黑人巨大精品一区二区| 91欧美日韩一区| 亚洲无限乱码一二三四麻| 亚洲最大福利视频网站| 国产成人精品av在线| 国产精品高精视频免费| 在线日韩av观看| 久久99青青精品免费观看| 日韩成人av一区| 欧美大片网站在线观看| 人妖精品videosex性欧美| 国产精品第一视频| 狠狠久久亚洲欧美专区| 欧美日韩另类视频| 欧美中文字幕在线播放| 欧美一乱一性一交一视频| 奇米影视亚洲狠狠色| 国产精品扒开腿做爽爽爽的视频| 久久久av网站| 超碰91人人草人人干| 日韩视频亚洲视频| 国产综合在线视频| 热门国产精品亚洲第一区在线| 亚洲欧美日韩在线高清直播| 欧美日韩国产精品专区| 欧美色视频日本高清在线观看| 欧洲精品在线视频| 欧美久久精品一级黑人c片| 日韩一区二区精品视频| 欧美性xxxx18| 亚洲电影免费观看高清完整版| 亚洲人在线视频| 欧美日韩一区二区精品| 色噜噜狠狠狠综合曰曰曰| 亚洲精品wwww| 国产精品丝袜白浆摸在线| 奇米4444一区二区三区| 亚洲国产精品成人va在线观看|