(1) XML:可擴展標記語言數組
a.語法 b.XML文檔的三部分(聲明、元素和屬性) c.其它注意點(注意不能交叉包含、空行換行、XML文檔只能有一個根元素等)
(2) XML解析框架
a.XML解析的兩種方式 001 SAX:從根元素開始,按順序一個元素一個元素的往下解析,可用於解析大、小文件 002 DOM:一次性將整個XML文檔加載到內存中,適合較小的文件 b.解析XML的工具 001 蘋果原生NSXMLParser:使用SAX方式解析,使用簡單 002 第三方框架 libxml2:純C語言的,默認包含在iOS SDK中,同時支持DOM和SAX的方式解析 GDataXML:採用DOM方式解析,該框架由Goole開發,是基於xml2的
(1)使用NSXMLParser解析XML步驟和代理方法ide
//解析步驟: //4.1 建立一個解析器 NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; //4.2 設置代理 parser.delegate = self; //4.3 開始解析 [parser parse];
----------------------------------------- //1.開始解析XML文檔 -(void)parserDidStartDocument:(nonnull NSXMLParser *)parser //2.開始解析XML中某個元素的時候調用,好比<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; } //字典轉模型 ZYQVideo *video = [ZYQVideo objectWithKeyValues:attributeDict]; [self.videos addObject:video]; } //3.當某個元素解析完成以後調用,好比</video> -(void)parser:(nonnull NSXMLParser *)parser didEndElement:(nonnull NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName //4.XML文檔解析結束 -(void)parserDidEndDocument:(nonnull NSXMLParser *)parser
(2)使用GDataParser解析XML的步驟和方法工具
//4.0 配置環境 // 001 先導入框架,而後按照框架使用註釋配置環境
編譯以後就發現這樣的錯誤:
解決方案:
// 002 GDataXML框架是MRC的,因此還須要告訴編譯器以MRC的方式處理GDataXML的代碼 //4.1 加載XML文檔(使用的是DOM的方式一口氣把整個XML文檔都吞下) GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil]; //4.2 獲取XML文檔的根元素,根據根元素取出XML中的每一個子元素 NSArray * elements = [doc.rootElement elementsForName:@"video"]; //4.3 取出每一個子元素的屬性並轉換爲模型 for (GDataXMLElement *ele in elements) { XMGVideo *video = [[XMGVideo 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 把轉換好的模型添加到tableView的數據源self.videos數組中 [self.videos addObject:video]; }
(1)多值參數如何設置請求路徑url
//多值參數 /* 若是一個參數對應着多個值,那麼直接按照"參數=值&參數=值"的方式拼接 */ -(void)test { //1.肯定URL NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/weather?place=Beijing&place=Guangzhou"]; //2.建立請求對象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3.發送請求 [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)如何解決字典和數組中輸出亂碼的問題spa
答:給字典和數組添加一個分類,重寫descriptionWithLocale方法,在該方法中拼接元素格式化輸出。 -(nonnull NSString *)descriptionWithLocale:(nullable id)locale