国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

淺談iOS解析HTMl標(biāo)簽以及開發(fā)中的一些坑

2020-07-26 02:35:26
字體:
供稿:網(wǎng)友

開篇

看了看更新日期好久沒寫簡(jiǎn)書了,經(jīng)常還有小伙伴在文章下面評(píng)論,看到自己寫的東西還是有點(diǎn)用的,鼓勵(lì)自己接著堅(jiān)持下去吧,哈哈。今天主要就寫寫iOS中怎么解析HTML標(biāo)簽,我們常用的后臺(tái)返回?cái)?shù)據(jù)一般是json格式的但是有些時(shí)候如果我們收到的是帶HTMl標(biāo)簽的我們?cè)撛趺刺幚硭兀裉炀蛠碚f一說吧。

正文

前兩天獲取后臺(tái)數(shù)據(jù)的時(shí)候,得到這么一條返回信息

"恭喜您獲得<font color='red'>8.1元</font>現(xiàn)金獎(jiǎng)勵(lì) "

本來簡(jiǎn)簡(jiǎn)單單的把返回?cái)?shù)據(jù)展示到label上的事情一下子變得有趣起來,后臺(tái)說是為了以后產(chǎn)品改返回內(nèi)容的時(shí)候容易處理,可以這理由很強(qiáng)勢(shì)。

但是作為開發(fā)的我們?cè)趺刺幚砟兀紫任覀兛聪掳沧康奶幚矸椒ǎ沧繉?duì)處理這個(gè)還是比較粗暴的人家有系統(tǒng)方法,如下:

那么iOS端怎么處理呢,我們可以用webview,也可以用Label的attributedString屬性,也可以直接簡(jiǎn)單粗暴的分割字符串,然后去除HTML標(biāo)簽,然后處理,聽聽就讓人惆悵,然而畢竟是一種方法,能解決問題的方法都是好方法,我們就放一下最粗暴方法的主要代碼(其余方法在評(píng)論補(bǔ)充有,哈哈),去除HTML標(biāo)簽的方法如下:

//過濾后臺(tái)返回字符串中的標(biāo)簽- (NSString *)flattenHTML:(NSString *)html {    NSScanner *theScanner;  NSString *text = nil;    theScanner = [NSScanner scannerWithString:html];    while ([theScanner isAtEnd] == NO) {    // find start of tag    [theScanner scanUpToString:@"<" intoString:NULL] ;    // find end of tag    [theScanner scanUpToString:@">" intoString:&text] ;    // replace the found tag with a space    //(you can filter multi-spaces out later if you wish)    html = [html stringByReplacingOccurrencesOfString:        [NSString stringWithFormat:@"%@>", text]                        withString:@""];  }  MidStrTitle = html;  return html;}

這樣我們就處理掉了HTML標(biāo)簽,那么問題來了,如果我們要處理的是很多的HTML標(biāo)簽?zāi)兀覀冊(cè)撛趺刺幚砟兀@就是這篇文章的目的。

TFHpple庫

如果我們想要得到是如下一個(gè)HTML源碼中某一個(gè)標(biāo)簽的內(nèi)容呢,部分源碼如下,這里只是放了標(biāo)簽部分的內(nèi)容

<title>關(guān)于APP的聲明</title></head><body><h3>關(guān)于APP的聲明</h3><p>只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試</p><p>只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試</p><h3>聯(lián)系我們</h3><p>若您在使用該APP有遇到任何問題或有新想法,都可以聯(lián)系我們. 如下是我們的聯(lián)系方式:</p><ul><li>只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試</li><li>E-mail: xxxxxxxxxxxxxxxxxxxxxxxxxx</li><li>phone: xxxxxxxxxxxxxxxxxx</li></ul><h3>感謝</h3><p>首先,感謝廣大用戶對(duì)公司的支持和鼓勵(lì),謝謝你們對(duì)我們的一路支持.</p><p>只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試</p><h3>版權(quán)聲明</h3><p>只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試只是測(cè)試</p></body></html>

這里如果我要針對(duì)性取某一個(gè)標(biāo)簽的內(nèi)容就要用到我們今天介紹的庫了。

環(huán)境的配置

導(dǎo)入靜態(tài)庫

然后把導(dǎo)入的靜態(tài)庫添加到文件的路徑

然后導(dǎo)入TFHpple庫就可以了。

使用方法1,簡(jiǎn)單的標(biāo)簽形式取值法

直接上代碼

NSString *resourcePath = [[NSBundle mainBundle] resourcePath];    NSString *filePath =[resourcePath stringByAppendingPathComponent:@"about.html"];    NSData *data =[[NSData alloc]initWithContentsOfFile:filePath];    NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  //data轉(zhuǎn)字符串 為了打印不是亂碼    NSLog(@"------%@",result);      TFHpple *Hpple = [[TFHpple alloc]initWithHTMLData:data];      //測(cè)試1:獲取簡(jiǎn)單的標(biāo)題    NSArray *array =[Hpple searchWithXPathQuery:@"http://title"]; //獲取到為title的標(biāo)題      for (TFHppleElement *HppleElement in array) {        NSLog(@"測(cè)試1的目的標(biāo)簽內(nèi)容:-- %@",HppleElement.text);          }

我們首先獲取到本地的about.html的文件,然后轉(zhuǎn)化為data,加UTF8編碼轉(zhuǎn)換為我們可以看到的容如下圖:

上部分為HTML文件的原標(biāo)簽,下部分為我們?nèi)サ降臉?biāo)簽為“title”的內(nèi)容。 這樣我們就得到了我們想要的

使用方法2:有自己屬性的標(biāo)簽內(nèi)容取值

上面的那個(gè)HTML文件由于內(nèi)容的局限性不方便我們舉例,我們使用的HTML標(biāo)簽源碼如下:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>hello</title></head><body>hello world<span></span>無序列表<ul type="disc">  <li>蘋果</li>  <li>水果</li>  <li>桃子</li></ul><ul type="circle">  <li>蘋果2</li>  <li>水果2</li>  <li>桃子2</li></ul></body></html>

我們想去取到的是無序列表 節(jié)點(diǎn)屬性為type 屬性值為disc的標(biāo)簽內(nèi)容,顯然上面的方法已經(jīng)不能滿足我們的需要,老規(guī)矩先上代碼:

//測(cè)試2:獲取更加詳細(xì)的內(nèi)容  NSString *resourcePath = [[NSBundle mainBundle] resourcePath];  NSString *filePath =[resourcePath stringByAppendingPathComponent:@"first.html"];  NSData *data =[[NSData alloc]initWithContentsOfFile:filePath];    NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  //data轉(zhuǎn)字符串 為了打印不是亂碼  NSLog(@"------%@",result);    TFHpple *Hpple = [[TFHpple alloc]initWithHTMLData:data];  NSArray *array =[Hpple searchWithXPathQuery:@"http://ul"];    for (TFHppleElement *HppleElement in array) {        if ([HppleElement.attributes[@"type"]isEqualToString:@"disc"]) { //找出 ul標(biāo)簽下 節(jié)點(diǎn)屬性type  屬性值為 disc 的數(shù)組            NSArray *array2 = [HppleElement searchWithXPathQuery:@"http://li"];            for (TFHppleElement *HppleElement2 in array2) {                NSLog(@"測(cè)試2的目的標(biāo)簽內(nèi)容:-- %@",HppleElement2.text);      }    }  }

使用方法重點(diǎn)在下面的這個(gè)if語句的判斷里

 if ([HppleElement.attributes[@"type"]isEqualToString:@"disc"]) {}

如果存在這種條件下的內(nèi)容,根據(jù)這個(gè)BOOL值,去取到下面標(biāo)簽為“l(fā)i‘的內(nèi)容 運(yùn)行結(jié)果如下:

項(xiàng)目中遇到的一些坑

我們?nèi)⊥炅藰?biāo)簽并不能結(jié)束,好不容易有時(shí)間就再寫一下一些遇到的小的問題吧。

自定義鍵盤

自定義鍵盤也算是老問題了,由于情況的不同,我們可能需要定義一個(gè)完全自定義的鍵盤,來適應(yīng)各種奇葩的需求。最近看代碼的時(shí)候才發(fā)現(xiàn)不同的人寫法真不一樣,這里介紹一個(gè)個(gè)人認(rèn)為比較簡(jiǎn)單的方法吧。

UITextField的inputView的屬性,用法舉例如下:

kkeyboardView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320 ,260 )] ;  kkeyboardView.backgroundColor = [UIColor lightGrayColor];  [self setUpMyKeyBoard2];  self.textfiled.inputView = kkeyboardView;

創(chuàng)建一個(gè)View 然后把它作為UITextField的inputView,這個(gè)時(shí)候就可以完全的自定義自己想要的自定義鍵盤了,產(chǎn)品你過來說說你還要鍵盤上有啥。

UIScrollView的滾動(dòng)問題

前天同事說了一個(gè)奇怪的問題,說懶加載也寫了,布局也搞了,偏移量也設(shè)置了,在別的頁面都搞好了,這個(gè)頁面的滾動(dòng)試圖忽然就不動(dòng)了。老司機(jī)也翻車了喜聞樂見,但是問題怎么處理呢。

-(void)viewDidLayoutSubviews{  _BaseScore.contentSize = CGSizeMake(SCREEN_WIDTH, 568.0 - 44); }

一陣折騰之后給了他這個(gè)方法,把偏移量寫在這個(gè)方法里就可以滾動(dòng)了,同事不禁說老了老了,發(fā)現(xiàn)自己記憶越來越差了,哈哈,有一群這樣的同事真的工作比較開心。

后記

今天的主要介紹就這么多吧,希望對(duì)需要的小伙伴有所幫助,有時(shí)間的話下次寫一下,項(xiàng)目中用到的,商家端生成二維碼收款,用戶端掃描二維碼付款,以及定時(shí)刷新,狀態(tài)判斷,掃描二維碼生成邀請(qǐng)碼等一系列二維碼相關(guān)的功能。有寫的不對(duì)地方的歡迎指出,大神輕噴,哈哈。

補(bǔ)充: 再補(bǔ)充兩條簡(jiǎn)單情況下的方法:

Label的attributedString屬性

NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[h5str dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];[selflab setAttributedText:attrStr];

利用web view

_webView = [[UIWebView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];NSString *html_str = [NSString stringWithFormat:@"<div style='color:red'>666666</div> 測(cè)試 %@",@"新風(fēng)作浪",@"2020-01-00"];[self.webView loadHTMLString:html_str baseURL:nil];[self.view addSubview:self.webView];

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜城市| 南宫市| 岑巩县| 土默特右旗| 绥德县| 合阳县| 游戏| 潜江市| 弥渡县| 庄浪县| 黔江区| 昌吉市| 方城县| 东丰县| 深州市| 陵川县| 商南县| 镇平县| 石柱| 汝城县| 边坝县| 余庆县| 华亭县| 满洲里市| 蓝田县| 宁津县| 淮滨县| 岐山县| 孝感市| 封丘县| 常州市| 牙克石市| 千阳县| 盱眙县| 罗平县| 如东县| 翼城县| 徐州市| 鄂尔多斯市| 噶尔县| 九寨沟县|