1.先建立一個message.txt文檔,內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<messages>
<message>
<receiver>美女與野獸</receiver>
<content>不見不散</content>
<sender>如花似玉</sender>
</message>
<message>
<receiver>美女與野獸</receiver>
<content>啦啦啦</content>
<sender>六一快樂</sender>
</message>
<message>
<receiver>彭于晏</receiver>
<content>華晨宇</content>
<sender>吳亦凡</sender>
</message>
</messages>
2.Message.h中聲明屬性柿顶,
//model中設(shè)置的屬性,要和xml中的標(biāo)簽名字一樣
@interface Message : NSObject
@property(nonatomic,copy)NSString * receiver;
@property(nonatomic,copy)NSString * content;
@property(nonatomic,copy)NSString * sender;
3.Message.m中寫一個防崩的方法
//防崩
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
}
4.在storyboard中拖一個button控件都弹,并關(guān)聯(lián)方法
5.ViewController.m
<1>定義一個屬性
//解析時需要使用數(shù)組
@property(nonatomic,strong)NSMutableArray * dataArray;
//定義一個可變字符串拼接使用
@property(nonatomic,strong)NSMutableString * appendString;
<2>在方法中開始解析
- (IBAction)saxParseForXML:(UIButton *)sender {
/*
sax解析:
要解析什么數(shù)據(jù)
解析數(shù)據(jù)用什么接收
誰有解析XML的能力
使用代理對象告知解析器什么時候開始解析
*/
//1.找到需要解析的數(shù)據(jù)
NSString * filepath = [[NSBundle mainBundle]pathForResource:@"message.txt" ofType:nil ];
//2.將找到的文件轉(zhuǎn)化為數(shù)據(jù)
NSData * fileData = [NSData dataWithContentsOfFile:filepath];
//3:創(chuàng)建解析器對象
NSXMLParser * parser = [[NSXMLParser alloc] initWithData:fileData];
//4 給解析器設(shè)置代理
parser.delegate = self;
//5.通知解析開始干活
[parser parse];
}
//實現(xiàn)協(xié)議中的方法
//4.1開始解析文檔:
-(void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"開始解析");
//解析出來的文檔。數(shù)據(jù)需要存儲萄金,所以定義可變數(shù)組存儲
self.dataArray =[NSMutableArray array];
}
//4.2開始解析標(biāo)簽
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
NSLog(@"開始解析標(biāo)簽");
//獲取模型對象
if ([elementName isEqualToString:@"message"]) {
//創(chuàng)建模型對象
Message * message = [Message new];
//將模型放入數(shù)組中
[self.dataArray addObject:message];
}
//初始化可變字符串硅卢,拼接使用
self.appendString = [NSMutableString string];
}
//4.3獲取文本
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"獲取文本信息");
//在獲取文本的內(nèi)容時堪滨,未必可以一次性取出计螺,可能多次取出,所以需要拼接
[self.appendString appendString:string];
}
//4.4結(jié)束標(biāo)簽解析
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"結(jié)束當(dāng)前標(biāo)簽");
//找到數(shù)組最后一個對象冶忱,創(chuàng)建model對象1
Message * message = [self.dataArray lastObject];
//使用KVC通過key將拼接的字符串給model
[message setValue:self.appendString forKey:elementName];
//拼接完畢尾菇,需要對字符串進行清空
self.appendString = nil;
}
//4.5結(jié)束解析文檔
-(void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"結(jié)束解析文檔");
//將數(shù)組中存儲的對象打印出來進行測試:
[self.dataArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@,%@,%@",[obj receiver],[obj content],[obj sender]);
}];
}
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"解析文檔出錯%@",parseError);
}
```c