什么都不说直接上代码.
//SAX解析XML关键方法
//创建xml解析对象
NSXMLParser* parser = [[NSXMLParser alloc]initWithData:data];
//设置代理
parser.delegate = self;
//执行解析
[parser parse];
下面是SAX解析的关键代理方法
//1.准备解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"开始解析文档了");
}
/**
* 2.开始一个新的标签
*
* @param parser
* @param elementName 标签的名字
* @param namespaceURI
* @param qName
* @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 = %@--attributeDict = %@",elementName,attributeDict);
}
//3.读出标签中的内容(这里注意标签中的内容不是一次性取出的,有可能是多次,一般都是多次)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"3--标签中的内容----%@",string);
}
/**
* 4.结束这个标签
*
* @param parser 自己
* @param elementName 标签名
* @param namespaceURI
* @param qName
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{
NSLog(@"4--elementName = %@",elementName);
}
//5结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"文档解析结束了");
}
// 解析出错的时候调用
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSLog(@"出错");
}
下面是我自己的一个例子,大家没事可以试试
需要解析的XML
<?xml version="1.0" encoding="utf-8"?>
<videos>
<video videoId="1">
<name>01.C语言-语法预览</name>
<length>320</length>
<videoURL>/itcast/videos/01.C语言-语法预览.mp4</videoURL>
<imageURL>/itcast/images/head1.png</imageURL>
<desc>C语言-语法预览</desc><teacher>李雷</teacher>
</video>
<video videoId="2">
<name>02.C语言-第一个C程序</name>
<length>2708</length>
<videoURL>/itcast/videos/02.C语言-第一个C程序.mp4</videoURL>
<imageURL>/itcast/images/head2.png</imageURL>
<desc>C语言-第一个C程序</desc>
<teacher>李雷</teacher>
</video>
<video videoId="3">
<name>03.C语言-函数</name>
<length>822</length>
<videoURL>/itcast/videos/03.C语言-函数.mp4</videoURL>
<imageURL>/itcast/images/head3.png</imageURL>
<desc>C语言-函数</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="4">
<name>04.C语言-基本数据类型</name>
<length>1113</length><
videoURL>/itcast/videos/04.C语言-基本数据类型.mp4</videoURL>
<imageURL>/itcast/images/head4.png</imageURL>
<desc>C语言-基本数据类型</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="5">
<name>05.C语言-基本运算</name>
<length>594</length>
<videoURL>/itcast/videos/05.C语言-基本运算.mp4</videoURL>
<imageURL>/itcast/images/head5.png</imageURL>
<desc>C语言-基本运算</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="6">
<name>06.C语言-数组</name>
<length>923</length>
<videoURL>/itcast/videos/06.C语言-数组.mp4</videoURL>
<imageURL>/itcast/images/head6.png</imageURL>
<desc>C语言-数组</desc><
teacher>韩梅梅</teacher>
</video>
</videos>
//模型文件Model.h
#import <Foundation/Foundation.h>
@interface Model : NSObject
@property (copy,nonatomic) NSNumber* videoId;
@property (copy,nonatomic) NSString* name;
@property (copy,nonatomic) NSNumber* length;
@property (copy,nonatomic) NSString* videoURL;
@property (copy,nonatomic) NSString* imageURL;
@property (copy,nonatomic) NSString* desc;
@property (copy,nonatomic) NSString* teacher;
@end
//模型.m文件
#import "Model.h"
@implementation Model
-(NSString *)description{
NSMutableString* s = [NSMutableString string];
[s appendString:[super description]];
[s appendFormat:@"videoId = %@,name = %@,length = %@,videoURL = %@",self.videoId,self.name,self.length,self.videoURL];
return s.copy;
}
@end
控制器内解析文件
#import "ViewController.h"
#import "Model.h"
@interface ViewController ()<NSXMLParserDelegate>
@property (strong,nonatomic) Model* currentModel;
@property (strong,nonatomic) NSMutableString* mString;
@property (strong,nonatomic) NSMutableArray* models;
@end
@implementation ViewController
-(NSMutableArray *)models{
if(!_models){
_models = [NSMutableArray arrayWithCapacity:10];
}
return _models;
}
- (void)viewDidLoad {
[super viewDidLoad];
//这里的XML的本地服务器的
NSURL* url = [NSURL URLWithString:@"http://127.0.0.1/videos.xml"];
NSMutableURLRequest* request =[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if (connectionError) {
NSLog(@"网络连接错误了");
return ;
}
NSHTTPURLResponse* httpRespones = (NSHTTPURLResponse *)response;
if (httpRespones.statusCode == 200 || httpRespones.statusCode == 304) {
// 成功解析数据
NSXMLParser* parser = [[NSXMLParser alloc]initWithData:data];
parser.delegate = self;
[parser parse];
}else{
//失败了
NSLog(@"请求失败了:%ld",httpRespones.statusCode);
}
}];
}
//1.准备解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"开始解析文档了");
}
/**
* 2.开始一个新的标签
*
* @param parser
* @param elementName 标签的名字
* @param namespaceURI
* @param qName
* @param attributeDict 标签属性(字典)
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{
if ([elementName isEqualToString:@"video"]) {
self.currentModel = [[Model alloc]init];
self.currentModel.videoId = @([attributeDict[@"videoId"] intValue]);
}
NSLog(@"2--elementName = %@--attributeDict = %@",elementName,attributeDict);
//给videoId赋值
self.mString = [NSMutableString string];
}
//3.读出标签中的内容(这里注意标签中的内容不是一次性取出的,有可能是多次,一般都是多次)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"3--标签中的内容----%@",string);
//拼接成一个完整的语句
[self.mString appendString:string];
}
/**
* 4.结束这个标签
*
* @param parser 自己
* @param elementName 标签名
* @param namespaceURI
* @param qName
*/
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{
NSLog(@"4--elementName = %@",elementName);
if ([elementName isEqualToString:@"video"]) {
[self.models addObject:self.currentModel];
self.currentModel = nil;
return;
}
[self.currentModel setValue:self.mString forKey:elementName];
self.mString = nil;
}
//5结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"文档解析结束了");
NSLog(@"%@",self.models);
}
// 解析出错的时候调用
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSLog(@"出错");
}
程序运行结果