今天来介绍一下XML数据解析的基础内容
通俗的来讲 所谓XML数据解析就是将带有标签样式的数据 利用XML解析方法将数据解析成为赋值给model的数据
我所了解的XML数据解析的方法有三种
- SAX解析
- DOM解析
- 利用一个三方(XMLReader 在githab上可以找得到)将XML数据解析成一个字典类型的数据
1.对于SAX解析他是利用系统的类 (NSXMLParser)进行数据解析 所以这种方法和其他方法进行比较 效率较高 这种方式进行数据解析是逐行进行操作的 让我们结合代码来看
首先我们得到一个XML的数据文件 获取这个文件路径 将其转化为NSData类型 然后创建NSXMLParser对象 将参数data填入(NSXMLParser我们要签这个类的协议)
NSString *path = [[NSBundle mainBundle] pathForResource:@"stu_xml" ofType:@".xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
xmlParser.delegate = self;
// 运行
[xmlParser parse];
// 在解析开始这个方法中 我们初始化数组
- (void)parserDidStartDocument:(NSXMLParser *)parser {
self.stuArray = [NSMutableArray array];
}
// 逐行解析 遇到节点头
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict {
// 逐行运行 将每一行的节点名赋值给定义的变量(记录节点 方便后期赋值)
_currentElementName = elementName;
// 遇到节点student 创建model
if ([elementName isEqualToString:@"student"]) {
Student *stu = [[Student alloc] init];
[_stuArray addObject:stu];
}
}
// 节点的值 (根据节点决定值)
- (void)parser:(NSXMLParser *)parser foundCharacters:(nonnull NSString *)string {
// string是"\n" "\t"
if (_currentElementName) {
Student *stu = [_stuArray lastObject];
// 赋值 (将节点名和节点值 通过 setValue forKey 赋值给model)
[stu setValue:string forKey:_currentElementName];
}
}
// 逐行解析 遇到节点尾 (直到数据每行都运行完毕执行该方法)
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName {
// 在节点尾 给节点名赋值为空
_currentElementName = nil;
}
// 解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@"%@", _stuArray);
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSLog(@"解析失败%@", parseError);
}
- DOM
第二种解析方式 DOM(document Object model)解析 不是逐行解析
关于GDataXMLNode的引入 - 引入.h .m 文件
- 引入系统libxml2.tbd
- 根据GDataXMLNode头文件 添加 /usr/include/libxml2
- 如果是ARC环境需要对该文件进行mrc编译(添加 -fno-objc-arc)
self.DOMStuArray = [NSMutableArray array];
NSString *path = [[NSBundle mainBundle] pathForResource:@"stu_xml" ofType:@".xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSError *error = nil;
// 创建GDataXMLDocument对象
// 根据xml的Data数据生成一个树形结构的 document
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:&error];
// 根据document 获取根节点
GDataXMLElement *rootElement = [document rootElement];
// 根据根节点 获取子节点数组
NSArray *rootChildrenElementArray = rootElement.children;
// 遍历子节点数组 得到对应所有student节点
for (GDataXMLElement *childElement in rootChildrenElementArray) {
Student *stu = [Student new];
NSLog(@"ARRAY %@", childElement);
[self.DOMStuArray addObject:stu];
// 遍历所有student的所有子节点
for (GDataXMLElement *grandSonElement in childElement.children) {
// .stringValue(节点值) .name(节点名)
[stu setValue:grandSonElement.stringValue forKey:grandSonElement.name];
}
}
3.用三方进行数据解析
NSString *path = [[NSBundle mainBundle] pathForResource:@"stu_xml" ofType:@".xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
NSError *error = nil;
NSDictionary *dic = [XMLReader dictionaryForXMLData:data error:&error];
// NSLog(@"%@", dic);
网友评论