一、 XML解析
- 1.1 XML簡單介紹
(1) XML:可擴展標(biāo)記語言
a.語法
b.XML文檔的三部分(聲明、元素和屬性)
c.其它注意點(注意不能交叉包含、空行換行哈踱、XML文檔只能有一個根元素等)
(2) XML解析
a.XML解析的兩種方式
001 SAX:從根元素開始俏竞,按順序一個元素一個元素的往下解析冀续,可用于解析大钢属、小文件
002 DOM:一次性將整個XML文檔加載到內(nèi)存中,適合較小的文件
b.解析XML的工具
001 蘋果原生NSXMLParser:使用SAX方式解析车猬,使用簡單
002 第三方框架
libxml2:純C語言的霉猛,默認(rèn)包含在iOS SDK中,同時支持DOM和SAX的方式解析
GDataXML:采用DOM方式解析珠闰,該框架由Goole開發(fā)惜浅,是基于xml2的
- 1.2 XML解析
(1)使用NSXMLParser解析XML步驟和代理方法
//解析步驟:
//4.1 創(chuàng)建一個解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//4.2 設(shè)置代理
parser.delegate = self;
//4.3 開始解析
[parser parse];
-----------------------------------------
//1.開始解析XML文檔
-(void)parserDidStartDocument:(nonnull NSXMLParser *)parser
//2.開始解析XML中某個元素的時候調(diào)用,比如<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;
}
//字典轉(zhuǎn)模型
Video *video = [Video objectWithKeyValues:attributeDict];
[self.videos addObject:video];
}
//3.當(dāng)某個元素解析完成之后調(diào)用伏嗜,比如</video>
-(void)parser:(nonnull NSXMLParser *)parser
didEndElement:(nonnull NSString *)elementName
namespaceURI:(nullable NSString *)namespaceURI
qualifiedName:(nullable NSString *)qName
//4.XML文檔解析結(jié)束
-(void)parserDidEndDocument:(nonnull NSXMLParser *)parser
(2)使用GDataParser解析XML的步驟和方法
//4.0 配置環(huán)境
// 001 先導(dǎo)入框架坛悉,然后按照框架使用注釋配置環(huán)境
// 002 GDataXML框架是MRC的,所以還需要告訴編譯器以MRC的方式處理GDataXML的代碼
//4.1 加載XML文檔(使用的是DOM的方式一口氣把整個XML文檔都吞下)
GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:kNilOptions error:nil];
//4.2 獲取XML文檔的根元素承绸,根據(jù)根元素取出XML中的每個子元素
NSArray * elements = [doc.rootElement elementsForName:@"video"];
//4.3 取出每個子元素的屬性并轉(zhuǎn)換為模型
for (GDataXMLElement *ele in elements) {
Video *video = [[Video 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 把轉(zhuǎn)換好的模型添加到tableView的數(shù)據(jù)源self.videos數(shù)組中
[self.videos addObject:video];
}
- 1.3 多值參數(shù)和中文輸出問題
(1)多值參數(shù)如何設(shè)置請求路徑
//多值參數(shù)
/*
如果一個參數(shù)對應(yīng)著多個值裸影,那么直接按照"參數(shù)=值&參數(shù)=值"的方式拼接
*/
-(void)test
{
//1.確定URL
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/weather?place=Beijing&place=Guangzhou"];
//2.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.發(fā)送請求
[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)如何解決字典和數(shù)組中輸出亂碼的問題
答:給字典和數(shù)組添加一個分類,重寫descriptionWithLocale方法军熏,在該方法中拼接元素格式化輸出轩猩。
-(nonnull NSString *)descriptionWithLocale:(nullable id)locale