天天看點

ios html 解析 布局,iOS html标簽解析解決方案

由于項目是基于b/s結構,因為在pc端上是沒有用戶端這概念隻有浏覽器,而對于web與移動端的關系,實際上還是類似于C/S結構,是以web端與web端的通信是通過發送HTML5标簽來實作,正常的做法中pc端與移動端是通過資料文本、檔案來通信來交流資訊的而非HTML5标簽。

解決方案:

為了解決通信的沖突,一般有兩個思路:(1)背景根據發送目标來比對發送資料。(2)适配傳輸内容。

思路一基于現有的條件來說實作難度大,而且不大現實。而思路二,也有一定的實作難度,但較思路一要現實,是以選擇思路二。

思路二的具體實作方案有兩種,方案一是基于文本發送,前端收到文本資訊後再封裝成html5标簽進行顯示,而移動端直接接受顯示。方案二是html5标簽,web端直接顯示,移動端解析顯示。

項目需要,選擇方案二。

Hpple

hpple,它是一個輕量級的包裝架構,可以很好的解決這個問題,尤其是它支援HTML的解析,是其他XML類庫所不及的地方,它是用XPath來定位和解析HTML或者XML。githut下載下傳位址

XPath定位原理

Xpath将xml的文檔結構視為一個樹形結構,元素、屬性、文本、注釋以及處理指令都是這個樹形結構上的節點,對于xml文檔中元素、屬性、文本、注釋以及處理指令的通路實際上是按順序周遊這棵樹,使用Xpath的路徑表示法,可以定位到XML文檔中的一個節點或者節點集合。

在Xpath中,可以使用相關辨別來定位元素以及其屬性,這些辨別符關鍵字主要有:child、self、parent、descendant、attribute等。

child為預設辨別符,self表示目前節點,parent表示上一級節點。

descendant表示目前子孫節點,attribute表示目前節點的屬性。

絕對路徑的Xpath表示

絕對路徑是從根節點到目标節點所經曆的路徑。

im子產品通信常見HTML5标簽樣式

//--------------------純文字----------------------------------//

//NSString *testData = @"

哈哈

";

//NSString *testData = @"

ha

";

//NSString *testData = @"

ha ni ha hehe wo

";

//NSString *testData = @"

嘿嘿,你好

";

//NSString

*testData = @"

1      1

1

1

";

//NSString *testData = @"

哈哈

";

//NSString

*testData =

@"

title111222333

77 7555444666

";

//---------------------圖文混合-------------------------------//

//NSString *testData = @"

水電費水電費

title=\"1438130709982028464.jpg\" alt=\"14.jpg\">山東省";

//---------------------純檔案---------------------------------//

//NSString *testData =   @"

name=\"68477\" target=\"_blank\">2015-07-20_205553.png

class=\"blockspan progress\" style=\"display: none;\">

class=\"blockspan progress-bar\" style=\"width:

100%;\">0%

";

內建TFHpple庫後,隻需要調用以下三行代碼,即可完成html5标簽的解析。

NSData*data = [testDatadataUsingEncoding:NSUTF8StringEncoding];

TFHpple*xpathParser = [[TFHpplealloc]initWithHTMLData:data];

NSArray*elements  = [xpathParsersearchWithXPathQuery:@"//p"];

在對純文字标簽的測試,基本都通過,無任何錯誤。知道解析

title111222333

77 7555444666

最後得到@[@“666”,@“111”,@“222”,@“555”,@“444”]的結果。

與目标結果@[@“title”,@“111”,@“222”,@“333”,@“444”,@“555”,@“666”]的結果相差甚遠。

根據程式實作邏輯可以将标簽轉成哈夫曼樹如下圖:

ios html 解析 布局,iOS html标簽解析解決方案

從圖可以容易得出,因為每個節點隻允許存儲一個數值,是以,後面的數值會覆寫之前存儲好的數值。

是以TFHpple庫未能滿足項目的要求。

針對TFHpple庫進行優化

針對上述的情況,為了實作不會有資料的丢失,修改TFHpple庫的實作邏輯,将資料結構改成NSArray,将所有的數值按照數組的值存儲起來。

經過修改的TFHpple庫解析後的哈夫曼樹圖如下:

ios html 解析 布局,iOS html标簽解析解決方案

之時,TFHpple解析出來的結果包含了所有的參數,但是順序确是換亂。因為Xpath對标簽是按照順序來解析的,而換了NSArray後,存儲的順序規律已經被破壞,是以需要從新為每個資料編定絕對位置。

通過給每個寫入結果的參數都添加上[i],其中i表示寫入的順序。當獲得結果後,再經過一個排序即可獲得最終結果。

但是,由于還有屬性參數已經因為檔案、圖檔類型的标簽的存在,是以需要在TFHpple的實作中添加一定的限制條件,隻允許文本、img-url、file-href三種關鍵資料的寫入。

是以添加的絕對标簽在最重的結果是不完整的,是以要将原本的絕對标簽視為相對标簽,再将其再轉換成絕對标簽,最後根據标簽順序整合文本、圖檔、檔案結果。

結果

最終實作了文本、圖檔、檔案三種類型的單獨或者混合形式的标簽的解析。

ios html 解析 布局,iOS html标簽解析解決方案