解析XML
最后更新于:2022-04-01 14:25:19
由于我们搭建好了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](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-07_5706110286e08.jpg "")