您的位置:首页 > 产品设计 > UI/UE

UI - XMLParser

2015-10-18 15:27 489 查看
<ViewController.h>

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end


<ViewController.m>

#import "ViewController.h"
#import "GDataXMLNode.h"
@interface ViewController ()<NSXMLParserDelegate>
@property (nonatomic,copy)NSString *toName;//收件人
@property (nonatomic,copy)NSString *fromName;//发件人
@property (nonatomic,copy)NSString *messageContent;//内容
@property (nonatomic,copy)NSString *date;//日期
@property (nonatomic,copy)NSString *content;//存储标签内的内容

@property (nonatomic,retain)NSMutableDictionary *categoryDic; //存储解析后的数据
@property (nonatomic,retain)NSMutableArray *categoryArr;//存储类别数据

@end

@implementation ViewController

/* 解析:以一种约定好的格式,后台开发人员将数据进行存储,前端开发人员按照这种格式进行数据的读取过程,数据的格式由后台开发人员决定,我们无权规定;
当今比较流行的两种数据形式为 XML 和 JSON , 其实对我们来说,解析就是从 XML 或者 JSON 数据格式中进行数据的获取;

1.XML 解析有两种方式: SAX 解析和 DOM 解析;
SAX解析: SAX解析基于事件回调,也就是通过代理协议方法回调的方式进行数据解析,也就是将数据一行一行读入内存,然后一行一行地进行数据的获取;
2.DOM 解析:DOM 解析是将数据整体读入内存,形成属性的数据结构形式,然后根据属性结构特点进行数据堆区,适合小型的数据,一般我们使用 Google 提供的第三方开源类库 GDataXMLNode

*/

// ================================ SAX解析 ==================================

// SAX解析
- (IBAction)SAXXMLParser:(id)sender {

//创建外部字典
self.categoryDic = [NSMutableDictionary dictionary];

NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Categories 2" ofType:@"xml"];
//1.获取文件路径
//    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Message" ofType:@"xml"];
//2.通过路径获取 NSData 数据对象
NSData *parserData = [NSData dataWithContentsOfFile:filePath];
//3.创建解析对象
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:parserData];
//4.设置代理
parser.delegate = self;

//5.开始解析    ,下面的代理方法都是由这步开始执行的
[parser parse];

//6.对解析后的数据进行处理

//    NSLog(@"发件人:%@,收件人:%@,内容:%@,时间:%@",self.fromName,self.toName,self.messageContent,self.date);
//

//遍历数据字典
for (NSString *key in _categoryDic) {
//通过 key 获取对应分组
NSMutableArray *group = [_categoryDic valueForKey:key];
//遍历分组
for (NSString *str in group) {
NSLog(@"%@",str);
}
}

}

#pragma mark - ParserDelegate
//读取到开始标签
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//打印开始标签的名字
NSLog(@"%@",elementName);

//读取到category_name的时候进行数组的创建
if ([elementName isEqualToString:@"category_name"]) {
self.categoryArr = [NSMutableArray array ];
}

}

//读取到内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//打印内容
NSLog(@"%@",string);

//获取内容
self.content = string;
}

//读取到结束标签
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
//打印结束标签名字
NSLog(@"%@",elementName);

//    //将读取的值赋给属性
//    if ([elementName isEqual:@"to"]) {
//        self.toName = _content;
//    }else if ([elementName isEqual:@"content"])
//    {
//        self.messageContent = _content;
//    }else if ([elementName isEqual:@"from"])
//    {
//        self.fromName = _content;
//    }else if ([elementName isEqual:@"date"])
//    {
//        self.date = _content;
//    }

if ([elementName isEqualToString:@"category_name"]) {
[self.categoryDic setValue:self.categoryArr forKey:_content];
NSLog(@"11111");
}else
{
//NSLog(@"dsakjfewklhfnklsd");
//存储_ conten 内容
[_categoryArr addObject:_content];
}

}

//========================= DOM 解析 ========================

//对于 DOM 解析我们需要进行三步配置:
//1.在 Build Phases 中的 Link Binary With Libraries 中导入动态链接库, libxml2.2.dylib
//2.在 build setting 中的 Header Search Paths 中添加 /usr/include/libml2
//3.在 build setting 中的 Other Linker Flags 中添加 -lxml2

//DOM 解析
- (IBAction)DOMXMLParser:(id)sender {

//1.获取文件路径
NSString *filePath = [[NSBundle mainBundle ]pathForResource:@"Categories 2" ofType:@"xml"];
//2.初始化 xmlString
NSString *xmlString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
//3.将 xmlString 读入 GDataXMLDocument
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithXMLString:xmlString options:0 error:nil];

//绝对路径方法获取节点
//    //4.获取根节点
//    GDataXMLElement *rootElement = [document rootElement];
//    //5.获取子节点
//    NSArray *elements = [rootElement elementsForName:@"categories"];//需要用数组接收
//    GDataXMLElement *element = [elements firstObject];
//
//    NSArray *categoryArr = [element elementsForName:@"subcategories"];
//    for (GDataXMLElement *a in categoryArr) {
//        NSLog(@"%@",[a stringValue]);
//    }

//4.根据相对路径进行节点获取
NSArray *elements = [document nodesForXPath:@"//subcategories" error:nil];
for (GDataXMLElement *element in elements) {
NSLog(@"%@",[element stringValue]);
}

}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: