一、项目的简介:
“智慧藏历”是一款将传统藏历与移动互联网平台结合的产品,它在以藏历版块为基础,提供便捷详实的藏历信息的前提下,分阶段增加气象版块、提醒版块、资讯版块。人们不仅能方便地从移动端获取藏历信息、天气信息,同时系统还能自动提醒用户注意一些关键信息,例如藏族节日的忌禁提醒、最新藏医药健康养生资讯提醒等,另外用户通过资讯版块还能轻易地了解到藏医药养生、宗教佛语、节庆日信息等最新新闻等相关信息。并且在后期实现用户可以通过语音模块收听按照季度、月、日等发送的福音或提示。
二、项目资料分析
数据库的数据:
部分UI
拿到这个项目有第一反应就是要做藏文的国际化,怎么做呢?按照常规的办法很明显不不行,于是看到有藏文的xml文件,我们打开看看
ཤེས་རབ་བོད་ཀྱི་ལི་ཐོ ཤེས་རབ་བོད་ཀྱི་ལི་ཐོ། V1.1 Settings Hello world! གཙོ་ངོས། དྲན་སྐུལ། རྒྱུ་འཕྲིན། སྒྲིག་འགོད། ལུགཤིང་། 2016 ལྷ་ས། བོད་ཟླ། སྤྱི་ཟླ། རླུང་ཕྱོགས།: རྒྱ་མཚོའི་ངོས་ལས་མཐོ་ཚད་ །: སྨུག་ཕྱིའི་འོད་ཚད། མཁའ་དབུགས་སྤུས་ཚད། མཁའ་དབུགས་རློན་ཚད།། བཤེར་འཚོལ། ཕྱིར་ལོག ཟུར་མཆན།
看到这里就感觉简单多了,对于藏文和中文的国际化 可以考虑用xml里面的name字段来做点文章,于是我封装了这样一个类
新建一个 FJXmlToJSon的类,在FJXmlToJSon.h文件声明以下方法
#import
@interface FJXmlToJSon : NSObject
/**
* xml转换为JSON
*
* @param xmlPathStr xml文件的路径
* @param fileName xml文件的文件名(方便进行输出为data文件)
* @param resultDic 返回json数据
* @param resultDataPath 返回存盘的data文件
*/
- (void)xmlToJson:(NSString *)xmlPathStr fileName:(NSString *)fileName resultDic:(void(^)(NSDictionary *resultDic))resultDic resultDataPath:(void(^)(NSString *pathStr))resultDataPath;
在FJXmlToJSon.m文件里面
#import "FJXmlToJSon.h"
@interface FJXmlToJSon (){
NSMutableArray *valueArray;//存储解析出所有的value
NSMutableArray *keyArray;//存储解析出所有的key
NSMutableString *currentValue;//存储每次解析的value
NSString *xmlFileName;//当前解析的xml文件名
}
/**
* 返回json数据格式的block
*/
@property (weak,nonatomic)void(^resultDic)(id resultDic);
/**
* 返回data文件路径的block
*/
@property (weak,nonatomic)void(^resultDataPath)(NSString *dataPathStr);
@end
在FJXmlToJSon.m文件里面实现
- (void)xmlToJson:(NSString *)xmlPathStr fileName:(NSString *)fileName resultDic:(void(^)(NSDictionary *resultDic))resultDic resultDataPath:(void(^)(NSString *pathStr))resultDataPath方法
- (void)xmlToJson:(NSString *)xmlPathStr fileName:(NSString *)fileName resultDic:(void(^)(NSDictionary *resultDic))resultDic resultDataPath:(void(^)(NSString *pathStr))resultDataPath{
valueArray = [NSMutableArray array];
keyArray = [NSMutableArray array];
currentValue = 0;
xmlFileName = fileName;
self.resultDic = resultDic;
self.resultDataPath = resultDataPath;
NSString *xmlContent=[[NSString alloc] initWithContentsOfFile:xmlPathStr encoding:NSUTF8StringEncoding error:nil];
NSXMLParser *xmlParse = [[NSXMLParser alloc]initWithData:[xmlContent dataUsingEncoding:NSUTF8StringEncoding]];
xmlParse.delegate = self;
[xmlParse parse];
}
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
NSLog(@"%@",attributeDict);
NSArray *temp = [attributeDict allValues];
if (temp.count != 0) {
[keyArray addObject:[temp lastObject]];
}
if (currentValue != nil) {
NSLog(@"%@",currentValue);
[valueArray addObject:currentValue];
currentValue = nil;
}
currentValue = [[NSMutableString alloc]init];
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
[currentValue appendString:string];
NSLog(@"%@",currentValue);
}
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"%@",valueArray);
if (currentValue) {
[valueArray addObject:currentValue];
}
NSLog(@"%@",keyArray);
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
for (int i = 0; i < keyArray.count; i ++) {
[dic setValue:valueArray[i] forKey:keyArray[i]];
}
NSLog(@"%@",dic);
self.resultDic([dic mutableCopy]);
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dic];
NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [documents stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.data",xmlFileName]];
[data writeToFile:path atomically:YES];
NSLog(@"%@",path);
self.resultDataPath(path);
}
使用方式:
把需要解析的xml文件拖入到项目中,传入xml的文件名
FJXmlToJSon *xml = [[FJXmlToJSon alloc]init];
NSString *path=[[NSBundle mainBundle] pathForResource:@"strings藏" ofType:@"xml"];
[xml xmlToJson:path fileName:@"strings藏" resultDic:^(NSDictionary *resultDic) {
//返回转换后的json数据
NSLog(@"%@",resultDic);
} resultDataPath:^(NSString *pathStr) {
//转换为存盘的文件
NSLog(@"%@",pathStr);
}];
源码下载地址 https://github.com/coolFangjun/FJXMlToJson.git
可能有朋友拿到上文中的pathStr的存盘路径的文件不知道如何使用,该文件是data文件,以下是我对这个的简单处理声明一个公共方法,keyStr为
- (NSString *)getString:(NSString *)keyStr;
以下是实现的方法,返回的是根据keyStr取出的对应的值
- (NSString *)getString:(NSString *)keyStr{
NSString *valueStr = nil;
if ([FJShareClass share].setAPPLange == SetLangeToZangwen) {
//页面设置为显示藏文
NSString *file = [[NSBundle mainBundle]pathForResource:@"strings藏" ofType:@"data"];
NSDictionary *dic = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
valueStr = dic[keyStr];
}else{
//显示中文
NSString *file = [[NSBundle mainBundle]pathForResource:@"strings" ofType:@"data"];
NSDictionary *dic = [NSKeyedUnarchiver unarchiveObjectWithFile:file];
valueStr = dic[keyStr];
}
//过滤掉字符串中的 \n 垃圾字符,影响UI页面排版
NSRange range = [valueStr rangeOfString:@"\n"];
if (range.location != NSNotFound) {
valueStr = [valueStr substringToIndex:range.location];
}
return valueStr;
}
业务逻辑可供参考!
1、欢迎来到Biny博客!
2、留言本,为留言而生。随意吐槽吧。。留下你的主页,还能友情互访哦!
3、专注于iOS移动端开发,欢迎广大大师们、大神们吐槽.....
4、欢迎友情链接 网站名:Biny博客 网址:http://www.Xcode.cc 描述:Biny博客是一个技术博客,文章主要包含移动互联IOS相关内容,记录一些在IOS编码过程中遇到的坑和看到大神们记录下的经验,以便查阅。