xml文件內容
<?xml version="1.0" encoding="UTF-8"?>
<root>
<person id="1">
<name>jack</name>
<personID>2015</personID>
<age>20</age>
</person>
<person id="2">
<name>rose</name>
<personID>2016</personID>
<age>18</age>
</person>
<person id="3">
<name>tom</name>
<personID>2017</personID>
<age>19</age>
</person>
<person id="4">
<name>jerry</name>
<personID>2018</personID>
<age>21</age>
</person>
</root>
下面是解析用的代碼以及詳細的註釋
#import "ViewController.h"
//這個就是一個model 三個屬性
#import "Person.h"
@interface ViewController ()<NSXMLParserDelegate>
@property(nonatomic,strong)id elementObject;
@property(nonatomic,strong)NSString *characterString;
@property(nonatomic,strong)NSMutableArray *elements;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self xmlParser];
}
- (void)xmlParser{
self.elements=[NSMutableArray array];
//從路徑獲取xml文件
NSString *path=[[NSBundle mainBundle]pathForResource:@"person" ofType:@"xml"];
NSData *data=[NSData dataWithContentsOfFile:path];
NSXMLParser *parser=[[NSXMLParser alloc]initWithData:data];
parser.delegate=self;
//開始解析自動調用代理方法
[parser parse];
}
- (void)parserDidStartDocument:(NSXMLParser *)parser{
//開始解析
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
//解析到第一個元素
//判斷解析到的元素是不是person 因爲這個是代理方法 我們可以創建多個perser
if ([elementName isEqualToString:@"person"]) {
self.elementObject=[[Person alloc]init];
}
//解析到了元素我們在這裏還看不到是什麼
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//查看到第一個元素的內容
NSLog(@"%@",string);
self.characterString=string;
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
//解析一個結束的元素節點 在xml中我們的元素存儲 是以一個個元素節點存儲的
NSLog(@"解析元素結束:%@",elementName);
//判斷解析到哪一個結束的元素節點 當爲root 證明已經解析到最後的元素節點 停止解析
if ([elementName isEqualToString:@"root"]) {
NSLog(@"解析結束");
}else if([elementName isEqualToString:@"person"]){
[self.elements addObject:self.elementObject];
//當解析到 person以下的元素節點 就是person的屬性 設置上 就行了
}else
[self.elementObject setValue:self.characterString forKey:elementName];
}
//結束解析
- (void)parserDidEndDocument:(NSXMLParser *)parser{
for (Person *per in self.elements) {
NSLog(@"%@",per.name);
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end