iOS-XML文件解析(原生NSXMLParser和GDataXML两种解析方式)

标签: xmliOS数据解析数据
4064人阅读 评论(1) 收藏 举报
分类:

XML文件解析常用的两种方式一种为苹果原生的NSXMLParser,另外一种为第三方GDataXML

1.原生的NSXMLParser方式:

//*利用 NSXMLParser 方式
-(void)XMLParserWithData:(NSData *)data{
    //1.创建NSXMLParser
    NSXMLParser *XMLParser = [[NSXMLParser alloc] initWithData:data];
    //2.设置代理
    [XMLParser setDelegate:self];
    //3.开始解析
    [XMLParser parse];
}

在代理方法中进行数据解析

#pragma mark - NSXMLParserDelegate
//1.开始解析XML文件
-(void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"开始解析XML文件");
}
//2.解析XML文件中所有的元素
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    NSLog(@"解析XML文件中所有的元素:elementName:%@,attributeDict:%@",elementName,attributeDict);
    if ([elementName isEqualToString:@"video"]) {
        //MJExtension 解析数据
        Model *model = [Model mj_objectWithKeyValues:attributeDict];
        [self.dataArrM addObject:model];
    }
}
//3.XML文件中每一个元素解析完成
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"XML文件中每一个元素解析完成:elementName:%@,qName:%@",elementName,qName);
}
//4.XML所有元素解析完毕
-(void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"XML所有元素解析完毕:%@",self.dataArrM);
}

这里写图片描述
这里写图片描述
最终解析完毕,得到自定义模型数组
这里写图片描述
获取到网络数据进行进一步UI主线程操作

2.第三方GDataXML-HTML方式解析XML
GDataXML-HTML github链接:https://github.com/graetzer/GDataXML-HTML

下载后项目结构如下,将classes文件中两个源文件拖到项目中
这里写图片描述

在将框架拖到项目中之后直接运行会报如下错误信息:
这里写图片描述

在GDataXML框架中已经明确说明了解决方法

// libxml includes require that the target Header Search Paths contain
//
//   /usr/include/libxml2
//
// and Other Linker Flags contain
//
//   -lxml2

根据他说明的进行两步配置:
配置1:
这里写图片描述
配置2:
这里写图片描述

根据他说明的两步配置都成功之后,再次运行就不会报错了.接下来进行XML文件解析:

导入头文件: 
#import "GDataXMLNode.h"


//*利用 GDataXMLNode 方式
-(void)XMLGDataXMLNodeWithData:(NSData *)data{
    //1.加载XML数据
    GDataXMLDocument *XMLDocument = [[GDataXMLDocument alloc] initWithData:data error:nil];
    //2.拿到XML文件中根元素下需要解析的子元素数组
    NSArray *elements = [XMLDocument.rootElement elementsForName:@"video"];
    //3.对子元素数组中所有数据进行解析
    [elements enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        GDataXMLElement *XMLElement = (GDataXMLElement *)obj;
        NSLog(@"XMLElement:%@",XMLElement);
        //打印发现 GDataXMLElement 对象是对每条数据进行了一层封装,可将其转化为字典进行字典模型转换
        Model *model = [[Model alloc] init];
        model.ID = [XMLElement attributeForName:@"id"].stringValue;
        model.name = [XMLElement attributeForName:@"name"].stringValue;
        model.image = [XMLElement attributeForName:@"image"].stringValue;
        model.url = [XMLElement attributeForName:@"url"].stringValue;
        [self.dataArrM addObject:model];
    }];

}

至此,解析成功!
注意在使用GDataXML解析过程中可以自行打印子元素数据,观察有用数据
子元素(GDataXMLElement)打印的数据
这里写图片描述
从中使用 attributeForName 函数抽取有用信息包装成模型,进行主线程UI操作.

完整项目github链接:https://github.com/qxuewei/XWXMLParserDemo

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:609149次
    • 积分:9908
    • 等级:
    • 排名:第1733名
    • 原创:372篇
    • 转载:56篇
    • 译文:3篇
    • 评论:119条
    博客专栏
    最新评论