<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                xml與json的對比,前面文章已經提供參考,至于xml的語法結構也不在這詳述。 直奔iOS中解析xml的方法。 **iOS中的XML解析(Dom和SAX)** Dom方式使用的是文檔對象模型解析,它首先要將xml文件整個讀入內存中,然后再來構建Dom對象,在DOM對象里,xml文件中的所有元素都可以當做節點(Node)對象來處理。這種方式優點是方便對文檔進行增加、刪除、修改、添加等操作,缺點是它首先要將整個文件讀入內存中在解析,如果文件大。會很消耗內存,并且它的執行速度慢。 SAX解析XML文件采用事件驅動的方式進行,也就是說,SAX是逐行掃描文件,遇到符合條件的設定條件后就會觸發特定的事件,回調你寫好的事件處理程?序。使用SAX的優勢在于其解析速度較快,占用內存較少(相對于DOM而言)。而且SAX在解析文件的過程中得到自己需要的信息后可以隨時終止解析,并不?一定要等文件全部解析完畢。凡事有利必有弊,其劣勢在于SAX采用的是流式處理方式,當遇到某個標簽的時候,它并不會記錄下以前所遇到的標簽,也就是說,?在處理某個標簽的時候,所能夠得到的信息就是標簽的名字和屬性,至于標簽內部的嵌套結構,上層標簽、下層標簽以及其兄弟節點的名稱等等與其結構?相關的信息都是不得而知的。實際上就是把XML文件的結構信息丟掉了,如果需要得到這些信息的話,只能你自己在程序里進行處理了。所以相對DOM而?言,SAX處理XML文檔沒有DOM方便,SAX處理的過程相對DOM而言也比較復雜。 **總結:** DOM:一次性將整個XML文檔加載進內存,比較適合解析小文件 SAX:SAX采用事件驅動,從根元素開始,按順序一個元素一個元素往下解析,比較適合解析大文件。 解析方法: 蘋果原生 NSXMLParser:SAX方式解析,使用簡單 第三方框架 libxml2:純C語言,默認包含在iOS SDK中,同時支持DOM和SAX方式解析 GDataXML:DOM方式解析,由Google開發,基于libxml2 XML解析方式的選擇建議 大文件:NSXMLParser、libxml2 小文件:GDataXML **GDataXML:** 常用的類 ? ? ?GDataXMLDocument:代表整個XML文檔 ? ? ?GDataXMLElement:代表文檔中的每個元素 常用方法: ? ? ?elementsForName:根據元素名稱得到元素節點 ? ? ?attributeForName:方法可以獲得屬性值 更多的操作xml的方法和屬性,查閱GDataXMLNode.h? 使用步驟: 1、下載GDataXMLNode ,下載地址:[http://download.csdn.net/detail/zhixinhuacom/9417644](http://download.csdn.net/detail/zhixinhuacom/9417644),并 解壓將其中的GDataXMLNode.h 和 GDataXMLNode.m文件拖到項目中。 2、由于GDataXML基于libxml2庫,因此要導入libxml2 ![](https://box.kancloud.cn/2016-03-07_56dd401233131.jpg) 3、設置libxml2的頭文件搜索路徑(為了能找到libxml2庫的所有頭文件) 在**Head Search Path**中加入/usr/include/libxml2 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??![](https://box.kancloud.cn/2016-03-07_56dd40124e2e7.jpg) 4、設置鏈接參數(自動鏈接libxml2庫) 在**Other Linker Flags**中加入-lxml2 ![](https://box.kancloud.cn/2016-03-07_56dd401279dd7.jpg) 5、如果報arc錯誤,則設置GDataXML編譯參數 ![](https://box.kancloud.cn/2016-03-07_56dd40129d19e.jpg) 6、導入#import "GDataXMLNode.h" 頭文件就可以使用了。 例子: 解析下面格式的xml ![](https://box.kancloud.cn/2016-03-07_56dd4012bd5ad.jpg)? ? ~~~ -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSURL *url = [NSURL URLWithString:@"http://localhost:8080/myService/video?type=XML"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { //1、加載xml數據 GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:nil]; //2、獲取xml根元素(videos) GDataXMLElement *root = document.rootElement; // //元素子節點個數(不包括子節點下的節點) // NSInteger childCount = root.childCount; // //元素名稱 // NSString *elementName = root.name; // //節點內容字符串 // NSString *xmlStr = root.XMLString; // NSLog(@"childCount=%ld\nelementName=%@\nxmlStr=%@",childCount,elementName,xmlStr); //3、獲取根元素的所有video元素 NSArray *elements = [root elementsForName:@"video"]; for (GDataXMLElement *element in elements) { //4、獲取屬性植 NSString *idStr = [element attributeForName:@"id"].stringValue; NSString *name = [element attributeForName:@"name"].stringValue; NSString *length = [element attributeForName:@"length"].stringValue; NSString *image = [element attributeForName:@"image"].stringValue; NSString *url = [element attributeForName:@"url"].stringValue; NSLog(@"id=%@",idStr); NSLog(@"name=%@",name); NSLog(@"length=%@",length); NSLog(@"image=%@",image); NSLog(@"url=%@",url); } }]; } ~~~ NSXMLParser: NSXMLParser采取的是SAX方式解析,特點是事件驅動,下面情況都會通知代理: (1)當掃描到文檔(Document)的開始與結束 (2)當掃描到元素(Element)的開始與結束 **一:使用步驟:** 1、傳入XML數據,創建解析器 ~~~ NSXMLParser?*parser = [[NSXMLParseralloc]?initWithData:data]; ~~~ 2、設置代理,監聽解析過程 `parser.delegate?=self;` 3、開始解析 [parserparse]; **二:NSXMLParserDelegate常用代理方法:** 當掃描到文檔的開始時調用(開始解析) `- (void)parserDidStartDocument:(NSXMLParser?*)parser` 當掃描到文檔的結束時調用(解析完畢) `- (void)parserDidEndDocument:(NSXMLParser?*)parser` 當掃描到元素的開始時調用(attributeDict存放著元素的屬性) `- (void)parser:(NSXMLParser?*)parser didStartElement:(NSString?*)elementName namespaceURI:(NSString?*)namespaceURI qualifiedName:(NSString?*)qName attributes:(NSDictionary?*)attributeDict` 當掃描到元素的結束時調用 `- (void)parser:(NSXMLParser?*)parser didEndElement:(NSString?*)elementName namespaceURI:(NSString?*)namespaceURI qualifiedName:(NSString?*)qName` 例子:同樣解析上面格式的xml ~~~ #import "ViewController.h" @interface ViewController ()<NSXMLParserDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSURL *url = [NSURL URLWithString:@"http://localhost:8080/myService/video?type=XML"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { //1、傳入xml,創建解析器 NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; //2、設置代理、監聽解析過程 parser.delegate = self; //3、開始解析 [parser parse]; }]; } #pragma mark NSXMLParserDelegate代理方法 //當掃描到元素的開始時調用(attributeDict存放著元素的屬性) -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{ NSLog(@"===========%@元素開始解析========",elementName); if ([@"videos" isEqualToString:elementName]) { NSLog(@"%@是根節點",elementName); return; } NSString *idStr = attributeDict[@"id"]; NSString *name = attributeDict[@"name"]; NSString *length = attributeDict[@"length"]; NSString *image = attributeDict[@"image"]; NSString *urlStr = attributeDict[@"url"]; NSLog(@" \n id=%@ \n name=%@\n length=%@ \n image=%@ \n url=%@",idStr,name,length,image,urlStr); }; //當掃描到元素的結束時調用 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ NSLog(@"===========%@元素解析結束========",elementName); } //當掃描到文檔的開始時調用(開始解析) -(void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"parserDidStartDocument=====開始解析======="); } //當掃描到文檔的結束時調用(解析完畢) -(void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"parserDidEndDocument=====解析完畢========"); } @end ~~~ 解析輸入結果: ![](https://box.kancloud.cn/2016-03-07_56dd40130638a.jpg)![](https://box.kancloud.cn/2016-03-07_56dd40133586f.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看