我爱编程

数据解析-XML解析

2016-08-11  本文已影响45人  9bf19a4010ab

今天来介绍一下XML数据解析的基础内容
通俗的来讲 所谓XML数据解析就是将带有标签样式的数据 利用XML解析方法将数据解析成为赋值给model的数据

我所了解的XML数据解析的方法有三种

  1. SAX解析
  2. DOM解析
  3. 利用一个三方(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);
}

  1. DOM
    第二种解析方式 DOM(document Object model)解析 不是逐行解析
    关于GDataXMLNode的引入
  2. 引入.h .m 文件
  3. 引入系统libxml2.tbd
  4. 根据GDataXMLNode头文件 添加 /usr/include/libxml2
  5. 如果是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);
上一篇下一篇

猜你喜欢

热点阅读