智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒

iPhone wap瀏覽器之預備篇

來源:網絡

點擊:2042

A+ A-

所屬頻道:新聞中心

關鍵詞: iPhone,wap瀏覽器,XML

      在筆者的上一篇文章《玩轉iPhone網絡通訊之BSD Socket篇》中,筆者試圖在iPhone平臺上利用BSD Socket搭建了一個同時兼容TCP/IP和HTTP協議進行通訊的框架,而在接下來的幾篇文章里,筆者將進一步完善這個網絡通訊的引擎并利用這個引擎寫一個簡易的wap瀏覽器。

      在iPhone的safari瀏覽器上并不支持WML的解析,盡管筆者也認為WML這種抱殘守舊的技術被淘汰是遲早的事,但WML作為XML結構的一個“變種”進行學習還是不錯的。

      最近瀏覽器技術很熱,熱得筆者都摸不著頭腦,前段時間金山的雷軍同志也投資UCWeb,盡管筆者并不覺得瀏覽器技術有什么高深的技術含量抑或可進行投資的價值,其實瀏覽器充其量是個客戶端,但是既然人家大牛看好,那筆者研究研究也不無益處,或許看完本文讀者也可以拿著自己的產品去找雷軍同志投資一把了:)

      閑話少話,言歸正傳。

      上面說了,WML是XML結構的一個“變種”或者說特例,既然是特例那么就可以把它當成XML來進行解析。那么做一個瀏覽器的任務流程就清晰了,如下:

      封裝BSD Socket進行HTTP請求。

      將請求到的WML頁面解析成XML數據結構。

      渲染需要在界面上顯示的WML標簽(英文名tag)。

      將渲染后的WML標簽顯示在界面上(UIView)。

      其中第一條在筆者的前一篇文中《玩轉iPhone網絡通訊之BSD Socket篇》已經進行了初步的編寫,當然筆者還會在下面的文章中進一步完善。

      這篇文章中著重講解WML的解析,因為WML是XML數據的特例,解析WML也就意味這解析XML。

      說到解析XML,iPhone為程序員提供了很多工具比如NSXMLParser,這個類的接口定義如下:

      @interface NSXMLParser : NSObject {

      @private

      void * _parser;

      id _delegate;

      id _reserved1;

      id _reserved2;

      id _reserved3;

      }

      - (id)initWithContentsOfURL:(NSURL *)url; // initializes the parser with the specified URL.

      - (id)initWithData:(NSData *)data; // create the parser from data

      // delegate management. The delegate is not retained.

      - (id)delegate;

      - (void)setDelegate:(id)delegate;

      - (void)setShouldProcessNamespaces:(BOOL)shouldProcessNamespaces;

      - (void)setShouldReportNamespacePrefixes:(BOOL)shouldReportNamespacePrefixes;

      - (void)setShouldResolveExternalEntities:(BOOL)shouldResolveExternalEntities;

      - (BOOL)shouldProcessNamespaces;

      - (BOOL)shouldReportNamespacePrefixes;

      - (BOOL)shouldResolveExternalEntities;

      - (BOOL)parse; // called to start the event-driven parse. Returns YES in the event of a successful parse, and NO in case of error.

      - (void)abortParsing; // called by the delegate to stop the parse. The delegate will get an error message sent to it.

      - (NSError *)parserError; // can be called after a parse is over to determine parser state.

      @end

      從接口的定義中大致可以知道,這個類解析XML是采用SAX模式(Simple API for XML),而SAX是基于事件驅動的,其基本工作流程是分析XML文件流數據,每當發現一個新的元素時,就會產生一個對應的事件,并調用相應的用戶處理函數。在iPhone上蘋果公司采用了delegate模式,每發現一個新的元素時,就會調用相應的委托接口進行XML標簽的處理。

      利用SAX模式解析XML占用內存少、速度快,但用戶需要把解析到的XML標簽自己組合成一個樹狀結構,從而使程序處理比較復雜。

      而對WML瀏覽器來說,盡管其tag并不是特別多,但是如果想完整的支持WML的tag也是一件比較枯燥的事情。所以,筆者這里采用DOM(Document Object Model)模式來解析XML文件。DOM模式在分析XML文件時,一次性的將整個XML文件流進行分析,并在內存中形成對應的樹結構,同時,向用戶提供一系列的接口來訪問和編輯該樹結構。這種方式占用內存大,速度往往慢于SAX模式,但可以給程序員提供一個面向對象的訪問接口,較為方便。

      XML語言的全稱是可擴展標識語言(eXtensible Markup Language),具體含義顧名思義就知道了。所謂“可擴展”,那是因為HTML等語言的不可擴展,在XML里的標簽都是可以自定義的,比如WML利用XML語言自定義了一套tag,于是就有了無線wap規范。

      XML的可擴展性是指在相應的規范和標準上的擴展。首先格式要符合XML的基本要求,比如第一行要有聲明,標簽的嵌套層次必須前后一致等等,符合這些要求的文件,就算是一個合格的XML文件,稱為Well-formatted。其次,XML文檔因其內容的不同還必須在語義上符合相應的標準,這些標準由相應的“DTD文件”或者“Schema文件”來了定義,符合了這些定義要求的XML文件,稱作Valid。

      筆者在本文中采用了開源的TinyXML解析器,這個解析器不會用相應的DTD文件對XML文件進行校驗,但它的體積很小,只包含兩個*.h文件和四個*.cpp文件。

      TinyXML是個開源的項目,更多詳細的信息可以參考http://www.grinninglizard.com/tinyxml/index.html。

      下載文件包后,把相應的文件導入到項目工程中,如下圖:

      

      圖1

      其中tinyxml.h文件包含了全部的聲明,在項目中只需要包含這個文件即可。

      Tinyxml.h中定義了很多結構,如下

      class TiXmlNode : public TiXmlBase

      {

      friend class TiXmlDocument;

      friend class TiXmlElement;

      …

      }

      這些類對應XML中的樹狀結構,拿下面的XML文檔為例:

      《?xml version=“1.0” encoding=“utf-8” ?》

      《!-example--》

      《food》

      《name》bread《/name》

      《price unit=”$”》1.5《/price》

      《description》made in China《/description》

      《/ food 》

      其中整個XML文檔用類TiXmlDocument表示,《food》、《name》、《price》、《description》等各自對應一個類TiXmlElement,XML文檔的第一行對應類TiXmlDeclaration,第二行對應類TiXmlComment,文本“example”對應類TiXmlText,unit則是元素price的一個TiXmlAttribute屬性。

      把TinyXML包導入到項目后,新建一個XMLParserEx.h文件和一個XMLParserEx.cpp文件來封裝XML的處理,頭文件定義如下:

      #ifndef _CC_XMLPARSEREX_H_

      #define _CC_XMLPARSEREX_H_

      #include 《stdio.h》

      #include “tinyxml.h”

      #define INVALID_ID -1

      class XMLParserEx

      {

      public:

      static XMLParserEx* GetInstance();

      static void Destroy();

      void RemoveAll();

      void parsexml(const char* buffer);

      void ElementParser(TiXmlNode* aParent);

      protected:

      XMLParserEx();

      ~XMLParserEx();

      private:

      static XMLParserEx* mInstance;

      };

      #endif

      XMLParserEx.cpp文件實現如下:

      #include “XMLParserEx.h”

      XMLParserEx::XMLParserEx()

      {

      }

      XMLParserEx::~XMLParserEx()

      {

      RemoveAll();

      }

      XMLParserEx* XMLParserEx::mInstance = 0;

      XMLParserEx* XMLParserEx::GetInstance()

      {

      if (mInstance == 0)

      {

      mInstance = new XMLParserEx();

      }

      return mInstance;

      }

      void XMLParserEx::Destroy()

      {

      if (mInstance)

      {

      delete mInstance;

      mInstance = 0;

      }

      }

      void XMLParserEx::RemoveAll()

      {

      }

      void XMLParserEx::ElementParser(TiXmlNode* aParent)

      {

      if(aParent == NULL)

      return;

      TiXmlNode* aChild = aParent-》FirstChild();

      while(aChild)

      {

      printf(“aChild value = %s\n”,aChild-》Value());

      int t = aChild-》Type();

      if( t == TiXmlNode::ELEMENT)

      {

      TiXmlAttribute* attr = aChild-》ToElement()-》FirstAttribute();

      if(attr)

      {

      TiXmlNode* node = aChild;

      while(node)

      {

      while(attr)

      {

      printf(“attr name = %s, attr value = %s\n”,attr-》Name(),attr-》Value());

      attr = attr-》Next();

      }

      node = node-》NextSiblingElement();

      }

      }

      ElementParser(aChild);

      }

      else if( t == TiXmlNode::TEXT)

      {

      printf(“aChild Value = %s\n”,aChild-》Value());

      }

      aChild = aChild-》NextSibling();

      }

      }

      void XMLParserEx::parsexml(const char* buffer)

      {

      TiXmlDocument* doc = new TiXmlDocument();

      printf(“xmlBuffer len = %d\n”,strlen(buffer));

      printf(“xmlBuffer is = %s\n”,buffer);

      doc-》Parse(buffer,0,TIXML_ENCODING_UTF8);

      TiXmlElement* root = doc-》RootElement();

      printf(“parse xml succeed\n”);

      ElementParser(root);

      }

    (審核編輯: 智匯小新)

    聲明:除特別說明之外,新聞內容及圖片均來自網絡及各大主流媒體。版權歸原作者所有。如認為內容侵權,請聯系我們刪除。

    主站蜘蛛池模板: 聚丙烯酰胺,聚合氯化铝,重金属捕捉剂,污泥调理剂,活性氧化铝,生石灰,反渗透阻垢剂,工业葡萄糖,硫酸铝,果壳活性炭,柱状活性炭,蜂窝活性炭,石英砂,锰砂-北京雁归来环保科技有限公司-以真诚为立足之本,以质量为生存之本,愿与海内外同仁共创双赢。雁归来人一路走来,气贯长虹,勇锐盖过怯弱,进取压倒苟安!我们紧扣时代脉搏,专注水处理、继往开来! | 雾度计-雾度仪-透光率测试仪-3nh品牌雾度仪生产厂家 | 型煤锅炉进煤机|型煤链条炉排 |重型板链除渣机 |丹东刮板输送机|丹东脱硫除尘器-铧洋机械 | 青砖_仿古砖_仿古小青瓦-「肥西晓军仿古建材」 | 上海办公室租赁-写字楼出租、创意产业园区厂房招商、孵化器众创联合办公空间出租网 | 荣事达电动洗地机_全自动工业洗地车_扫地机_清洁设备工厂 | 兰州物流公司_兰州货运公司_兰州物流电话上门取货_兰州立辉物流公司 | 呼吸家官网|肺功能检测仪生产厂家|国产肺功能仪知名品牌|肺功能检测仪|肺功能测试仪|婴幼儿肺功能仪|弥散残气肺功能仪|肺功能测试系统|广州红象医疗科技有限公司|便携式肺功能仪|大肺功能仪|呼吸康复一体机|儿童肺功能仪|肺活量计|医用简易肺功能仪|呼吸康复系统|肺功能仪|弥散肺功能仪(大肺)|便携式肺功能检测仪|肺康复|呼吸肌力测定肺功能仪|肺功能测定仪|呼吸神经肌肉刺激仪|便携式肺功能 | 长沙设计公司丨品牌策划设计服务丨画册设计-石青|长沙画册设计 | 济南手板_山东快速成型-山东嘉瑞杰机械科技有限公司 | 九江市新双龙广告装饰有限公司| 永磁电机,防爆电机,调速电机,永磁同步电机_河南华信电机股份有限公司 | 黑料网 - 黑料大事记-黑料门 黑料社最新 今日黑料 热门黑料 最新反差免费-黑料网今日黑料首页_黑料网 - 黑料大事记-黑料门 黑料社最新 今日黑料 热门黑料 最新反差免费-黑料网今日黑料首页 | 徐州护栏,围栏,锌铁丝网围栏安全设施专家徐州铜山区威峰金属护栏厂 | 饮料制造机械设备-罐体设备报价-CIP清洗设备-饮料生产线交钥匙工程-上海哲苏轻工机械有限公司 | 上海源科生物技术有限公司| 青岛网站建设_网站制作_品牌设计_网站设计_圭谷设计 | 气密仪-气密性检测仪-气密性测试仪-苏州莱和电子科技有限公司 | 开水机-节能开水器-即热式开水器-上海捷水环保科技有限公司 | 行李快递安检机-便携式X光安检仪-行李安检机-液体-爆炸物探测仪-安天下安检设备 | 液压万能试验机价格_电子万能试验机|摩擦磨损试验机厂家-济南辰达试验机制造有限公司 | 深圳社区邦家政公司-保姆_月嫂_育儿嫂 _早教育婴师_家政钟点工_家政培训_家政加盟- 社区邦优质生活服务 专业、标准化、便捷、安心,一站式家庭服务平台,服务专业有保障 ! | 四川教师资格网-四川教师资格考试网| 瑞安网站建设_网站制作_做网站找瑞安联创网络:专业网页制作、手机网站、SEO百度网站关键字优化 软文营销推广-新闻稿发布-软文撰写-百科词条编辑-品牌全案策划推广网络营销传播-喜尚传媒 | 久久91精品久久91综合_国产亚洲自拍一区_国产精品第1页_亚洲高清视频一区_91成人午夜在线精品_亚洲国产精品网站在线播放_亚洲国产成人久久综合区_国产精品亚洲专区在线观看_免费视频精品一区二区三区 | 友信京泰-操作台-调度台-控制台-监控台定制厂家 | 萍乡市信源电瓷制造有限公司--官网|萍乡市信源电瓷|萍乡电瓷厂|萍乡绝缘子-萍乡市信源电瓷制造有限公司 | 烟台真空包装,烟台木包装,烟台熏蒸木箱-烟台福岭木制品有限公司 烟台通风管道,烟台风机风管,烟台风阀-烟台福莱通风设备有限公司 | 金属剪切机,金属打包机,废钢剪切机,废铁压块机,金属压块机,废纸打包机,重废龙门剪,废钢龙门剪,箱式剪,液压剪切机-瑞顿机械装备制造江阴有限公司 | 数字多媒体展厅设计,智慧科技互动企业展馆展厅设计公司-深圳炫之风 | 智慧社区_【功能更全、价格更低、案例更多】 - | 扬州市检测仪器科技有限公司 | 涡街流量计罗茨气体涡轮厂家_衡水多元仪表有限公司 | 快速卷帘门-电动卷帘门-快速堆积门-快速门厂家-任丘市康速机电设备有限公司 | 久久91精品久久91综合_国产亚洲自拍一区_国产精品第1页_亚洲高清视频一区_91成人午夜在线精品_亚洲国产精品网站在线播放_亚洲国产成人久久综合区_国产精品亚洲专区在线观看_免费视频精品一区二区三区 | 室内模拟高尔夫,射箭馆-北京鹰搏蓝天科技有限公司 | 幼儿园设计公司/南昌酒店装修/办公室/餐厅/民宿/店面/展厅/装修设计公司-益昌装饰集团 | 青浦区摄像头安装/青浦区无线网络覆盖/青浦区网络调试公司/青浦区IT外包公司/金山区网络维护公司/金山区防火墙调试公司 | 正宗舌尖上的卤味卤菜卤肉卤水熟食的做法及配方大全网 | 主题公园设计|主题公园规划|水上乐园设计|龙翔设计|龙翔景观|龙翔文旅|深圳市龙翔设计景观工程有限公司 | 输送机电动滚筒_山东电动滚筒_输送机滚筒_皮带输送机-山东中输输送机械有限公司 |