XML解析

 XML解析

  • 2.1 XML簡單介紹

(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的
  • 2.2 XML解析

(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]; }
  • 2.3 多值參數和中文輸出問題

(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
相關文章
相關標籤/搜索