iOS開發(fā)-XML解析

一、 XML解析

  • 1.1 XML簡單介紹

(1) XML:可擴展標(biāo)記語言

    a.語法
    b.XML文檔的三部分(聲明、元素和屬性)
    c.其它注意點(注意不能交叉包含、空行換行哈踱、XML文檔只能有一個根元素等)

(2) XML解析

    a.XML解析的兩種方式
        001 SAX:從根元素開始俏竞,按順序一個元素一個元素的往下解析冀续,可用于解析大钢属、小文件
        002 DOM:一次性將整個XML文檔加載到內(nèi)存中,適合較小的文件
    b.解析XML的工具
        001 蘋果原生NSXMLParser:使用SAX方式解析车猬,使用簡單
        002 第三方框架
            libxml2:純C語言的霉猛,默認(rèn)包含在iOS SDK中,同時支持DOM和SAX的方式解析
            GDataXML:采用DOM方式解析珠闰,該框架由Goole開發(fā)惜浅,是基于xml2的
  • 1.2 XML解析

(1)使用NSXMLParser解析XML步驟和代理方法

//解析步驟:
//4.1 創(chuàng)建一個解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//4.2 設(shè)置代理
parser.delegate = self;
//4.3 開始解析
[parser parse];

-----------------------------------------

//1.開始解析XML文檔
-(void)parserDidStartDocument:(nonnull NSXMLParser *)parser

//2.開始解析XML中某個元素的時候調(diào)用,比如<video>
-(void)parser:(nonnull NSXMLParser *)parser 
       didStartElement:(nonnull NSString *)elementName 
       namespaceURI:(nullable NSString *)namespaceURI 
       qualifiedName:(nullable NSString *)qName 
       attributes:(nonnull NSDictionary<NSString *,NSString *> *)attributeDict
{
    if ([elementName isEqualToString:@"videos"]) {
        return;
    }
    //字典轉(zhuǎn)模型
    Video *video = [Video objectWithKeyValues:attributeDict];
    [self.videos addObject:video];
}

//3.當(dāng)某個元素解析完成之后調(diào)用伏嗜,比如</video>
-(void)parser:(nonnull NSXMLParser *)parser 
       didEndElement:(nonnull NSString *)elementName 
       namespaceURI:(nullable NSString *)namespaceURI 
       qualifiedName:(nullable NSString *)qName

//4.XML文檔解析結(jié)束
-(void)parserDidEndDocument:(nonnull NSXMLParser *)parser

(2)使用GDataParser解析XML的步驟和方法


//4.0 配置環(huán)境
// 001 先導(dǎo)入框架坛悉,然后按照框架使用注釋配置環(huán)境
// 002 GDataXML框架是MRC的,所以還需要告訴編譯器以MRC的方式處理GDataXML的代碼

//4.1 加載XML文檔(使用的是DOM的方式一口氣把整個XML文檔都吞下)
    GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];

//4.2 獲取XML文檔的根元素承绸,根據(jù)根元素取出XML中的每個子元素
  NSArray * elements = [doc.rootElement elementsForName:@"video"];

//4.3 取出每個子元素的屬性并轉(zhuǎn)換為模型
for (GDataXMLElement *ele in elements) {

    Video *video = [[Video alloc]init];
    video.name = [ele attributeForName:@"name"].stringValue;
    video.length = [ele attributeForName:@"length"].stringValue.integerValue;
    video.url = [ele attributeForName:@"url"].stringValue;
    video.image = [ele attributeForName:@"image"].stringValue;
    video.ID = [ele attributeForName:@"id"].stringValue;

    //4.4 把轉(zhuǎn)換好的模型添加到tableView的數(shù)據(jù)源self.videos數(shù)組中
    [self.videos addObject:video];
}

  • 1.3 多值參數(shù)和中文輸出問題

(1)多值參數(shù)如何設(shè)置請求路徑

//多值參數(shù)
/*
 如果一個參數(shù)對應(yīng)著多個值裸影,那么直接按照"參數(shù)=值&參數(shù)=值"的方式拼接
 */
-(void)test
{
    //1.確定URL
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/weather?place=Beijing&place=Guangzhou"];
    //2.創(chuàng)建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.發(fā)送請求
    [NSURLConnection sendAsynchronousRequest:request 
                     queue:[NSOperationQueue mainQueue] 
                     completionHandler:^(NSURLResponse * _Nullable response, 
                                         NSData * _Nullable data, 
                                         NSError * _Nullable connectionError) {

        //4.解析
        NSLog(@"%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];
}

(2)如何解決字典和數(shù)組中輸出亂碼的問題

答:給字典和數(shù)組添加一個分類,重寫descriptionWithLocale方法军熏,在該方法中拼接元素格式化輸出轩猩。
-(nonnull NSString *)descriptionWithLocale:(nullable id)locale
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子均践,更是在濱河造成了極大的恐慌晤锹,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彤委,死亡現(xiàn)場離奇詭異鞭铆,居然都是意外死亡,警方通過查閱死者的電腦和手機葫慎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來薇宠,“玉大人偷办,你說我怎么就攤上這事〕胃郏” “怎么了椒涯?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長回梧。 經(jīng)常有香客問我废岂,道長,這世上最難降的妖魔是什么狱意? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任湖苞,我火速辦了婚禮,結(jié)果婚禮上详囤,老公的妹妹穿的比我還像新娘财骨。我一直安慰自己,他們只是感情好藏姐,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布隆箩。 她就那樣靜靜地躺著,像睡著了一般羔杨。 火紅的嫁衣襯著肌膚如雪捌臊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天兜材,我揣著相機與錄音理澎,去河邊找鬼。 笑死曙寡,一個胖子當(dāng)著我的面吹牛矾端,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卵皂,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼秩铆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起殴玛,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捅膘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后滚粟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寻仗,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年凡壤,在試婚紗的時候發(fā)現(xiàn)自己被綠了署尤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡亚侠,死狀恐怖曹体,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情硝烂,我是刑警寧澤箕别,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站滞谢,受9級特大地震影響串稀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狮杨,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一母截、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧橄教,春花似錦微酬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滓走,卻和暖如春垦江,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搅方。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工比吭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姨涡。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓衩藤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涛漂。 傳聞我的和親對象是個殘疾皇子赏表,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容