牛骨文教育服务平台(让学习变的简单)

由于我们搭建好了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;
}

搞定:看结果:

解析XML