在IOS开发中,解析XML文件是常见的数据处理需求,多数服务端接口会返回XML格式的数据,需要开发者将其转换为可用的模型对象。目前IOS平台主要有两种XML解析思路,一种是系统原生的基于事件驱动的NSXMLParser解析,另一种是第三方库提供的DOM解析方式,开发者可以根据数据量和解析复杂度选择合适的方案。

原生NSXMLParser解析方式
NSXMLParser是IOS系统自带的XML解析类,采用SAX解析模式,逐行读取XML内容,内存占用低,适合解析体积较大的XML文件。使用时需要遵循NSXMLParserDelegate协议,实现对应的代理方法处理解析过程中的节点信息。
核心实现步骤
- 创建NSXMLParser实例,传入XML数据
- 设置解析器的代理对象
- 调用parse方法启动解析
- 在代理方法中处理解析到的元素、属性等信息
代码示例
以下是一个解析简单学生信息XML的示例,XML内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="1">
<name>张三</name>
<age>20</age>
<score>95</score>
</student>
<student id="2">
<name>李四</name>
<age>21</age>
<score>88</score>
</student>
</students>对应的解析代码实现:
#import "ViewController.h"
@interface ViewController () <NSXMLParserDelegate>
@property (nonatomic, strong) NSMutableArray *studentArray; // 存储解析结果
@property (nonatomic, strong) NSMutableDictionary *currentStudent; // 当前解析的学生字典
@property (nonatomic, strong) NSString *currentElement; // 当前解析的元素名
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 模拟获取XML数据,实际开发中可能是网络请求返回的数据
NSString *xmlString = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?><students><student id=\"1\"><name>张三</name><age>20</age><score>95</score></student><student id=\"2\"><name>李四</name><age>21</age><score>88</score></student></students>";
NSData *xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
// 创建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];
parser.delegate = self;
// 启动解析
BOOL success = [parser parse];
if (success) {
NSLog(@"解析成功,结果:%@", self.studentArray);
} else {
NSLog(@"解析失败,错误:%@", parser.parserError);
}
}
#pragma mark - NSXMLParserDelegate 方法
// 开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser {
self.studentArray = [NSMutableArray array];
}
// 遇到开始标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
self.currentElement = elementName;
if ([elementName isEqualToString:@"student"]) {
// 遇到student标签,创建新的学生字典,存储id属性
self.currentStudent = [NSMutableDictionary dictionary];
self.currentStudent[@"id"] = attributeDict[@"id"];
}
}
// 遇到标签内的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if ([self.currentElement isEqualToString:@"name"]) {
self.currentStudent[@"name"] = string;
} else if ([self.currentElement isEqualToString:@"age"]) {
self.currentStudent[@"age"] = string;
} else if ([self.currentElement isEqualToString:@"score"]) {
self.currentStudent[@"score"] = string;
}
}
// 遇到结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"student"]) {
// student标签结束,将当前学生字典加入数组
[self.studentArray addObject:self.currentStudent];
self.currentStudent = nil;
}
self.currentElement = nil;
}
// 解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"XML解析完成");
}
@end第三方XMLReader解析方式
如果不想手动处理代理方法,也可以使用第三方库XMLReader,它可以将XML直接转换为NSDictionary,简化解析流程。XMLReader采用DOM解析模式,会把整个XML加载到内存中,适合解析体积较小的XML文件。
使用步骤
- 导入XMLReader库到项目中
- 调用类方法直接解析XML数据
- 从返回的字典中获取需要的数据
代码示例
#import "ViewController.h"
#import "XMLReader.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 同样的XML数据
NSString *xmlString = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?><students><student id=\"1\"><name>张三</name><age>20</age><score>95</score></student><student id=\"2\"><name>李四</name><age>21</age><score>88</score></student></students>";
NSData *xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
// 解析XML为字典
NSDictionary *resultDict = [XMLReader dictionaryForXMLData:xmlData error:&error];
if (error) {
NSLog(@"解析失败:%@", error);
} else {
NSLog(@"解析结果:%@", resultDict);
// 从字典中提取学生数组
NSArray *studentArray = resultDict[@"students"][@"student"];
for (NSDictionary *student in studentArray) {
NSString *name = student[@"name"][@"text"];
NSString *age = student[@"age"][@"text"];
NSString *score = student[@"score"][@"text"];
NSString *stuId = student[@"id"];
NSLog(@"学生ID:%@,姓名:%@,年龄:%@,分数:%@", stuId, name, age, score);
}
}
}
@end两种方案对比
可以通过下表对比两种解析方式的特点,选择合适的方案:
| 解析方式 | 内存占用 | 解析速度 | 实现复杂度 | 适用场景 |
|---|---|---|---|---|
| NSXMLParser | 低 | 较快 | 较高,需要写代理方法 | 大体积XML文件解析 |
| XMLReader | 较高,需要加载整个XML到内存 | 较快 | 低,直接返回字典 | 小体积XML文件解析 |
注意事项
- 解析XML时要注意编码格式匹配,避免中文乱码问题,通常XML声明中会指定编码,解析时对应使用即可
- 使用NSXMLParser时,
foundCharacters:方法可能会被多次调用,同一个标签的内容可能会被拆分,需要做好字符串拼接处理 - 如果XML结构复杂,建议先梳理清楚节点层级,再编写对应的解析逻辑,避免遗漏数据
IOSXML解析NSXMLParserXMLReader数据解析修改时间:2026-06-03 15:03:18