由于我們搭建好了Apache服務器,那么我們接下來看一下如何解析服務器返回的xml文件
雖然開發中,服務器返回的xml格式的數據較少,但是偶爾還是會有的。
由于解析xml沒有比較好的第三方框架,所以我們還是乖乖的苦逼的寫代碼,雖然說,代碼沒有難度
xml數據:
~~~
<videos>
<video videoId="1">
<name>張三</name>
<teacher>張老師</teacher>
</video>
</videos>
~~~
首先從服務器獲取回來數據先
~~~
NSURL *url = [NSURL URLWithString:@"http://localhost/videos.xml"];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:10.0];
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//創建xml解析器
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
//設置代理
parser.delegate = self;
//開始解析
[parser parse];
}];
~~~
我們依次的看一下我們要用到的代理方法
**開始解析調用(只會調用一次)**
~~~
- (void)parserDidStartDocument:(NSXMLParser *)parser {
NSLog(@"1.開始文檔");
}
~~~
**每發現一個開始節點就調用**
~~~
/**
* 每發現一個節點就調用
* * @param parser 解析器
* @param elementName 節點名字
* @param attributeDict 屬性字典
*/
* (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict
{
NSLog(@"2.發現節點:%@",elementName);
if ([elementName isEqualToString:@"video"])
{
//創建模型對象
self.video = [[ZYVideo alloc]init];
}
[self.elementNameString setString:@""];
}
~~~
**發現節點內容**
~~~
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"3.發現節點內容:%@",string);
//把發現的內容進行拼接
[self.elementNameString appendString:string];
}
~~~
**發現結束節點**
~~~
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
{
NSLog(@"3.發現結束節點 %@",elementName);
// NSLog(@"拼接的內容%@",self.elementNameString);
if ([elementName isEqualToString:@"name"])
{
self.video.name = self.elementNameString;
}else if ([elementName isEqualToString:@"teacher"])
{
self.video.teacher = self.elementNameString;
}
}
~~~
**解析完畢調用**
~~~
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"解析完畢---------");
NSLog(@"%@",self.video);
}
~~~
提前做好的懶加載:
~~~
#pragma mark - 懶加載
- (NSMutableString *)elementNameString
{
if (_elementNameString == nil)
{
_elementNameString = [[NSMutableString alloc]init];
}
return _elementNameString;
}
~~~
搞定:看結果:
