在iOS中常用的两种解析方式使用XML、Json
一、 XML
XML:Extensible Markup Language(可扩展的标记语言),主流数据之一,可用来存储和传输数据
XML 两种解析方式:SAX解析、DOM解析 (安卓中多一个PULL解析)
SAX解析 :(需要引入<NSXMLParserDelegate>)
simple API for XML 基于事件机制的解析方式,采用逐行解析数据(采用协议回调机制)
SAX 具体用法
- (void)SexXmlAction {
// 模拟从网络上拿到数据
NSString *path = [[NSBundlemainBundle]pathForResource:@"message"ofType:@"txt"];
NSData *data = [NSDatadataWithContentsOfFile:path];
// 开始解析
// 1、创建解析对象,绑定数据
NSXMLParser *parser = [[NSXMLParseralloc] initWithData:data];
// 2、指定代理
parser.delegate = self;
// 3、开始解析
[parser parse];
}
// 4、实现代理的方法
// 开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser {
// NSLog(@"开始解析文档");
self.data = [NSMutableArrayarray];
}
// 开始解析标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
// NSLog(@"开始解析标签");
if ([elementName isEqualToString:@"person"]) {
Person *p = [[Personalloc] init];
[self.dataaddObject:p];
}
self.currentElement = elementName;
self.tempString = [NSMutableStringstring];
}
// 解析中间数据项
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
// NSLog(@"解析中间数据项");
// NSLog(@"%@",string);
[self.tempString appendString:string];
}
// 结束解析标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
Person *p = [self.datalastObject];
// 利用KVC进行属性赋值
[p setValue:self.tempStringforKey:self.currentElement];
// NSLog(@"结束解析标签");
self.currentElement =nil;
self.tempString =nil;
}
// 结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser {
// NSLog(@"结束解析文档");
for (Person *pin self.data) {
NSLog(@"%@ -- %@ -- %@",p.name, p.sex, p.info);
}
}
// 文档出错之后
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSLog(@"OMG,文档有毒!!!!!");
}
* DOM -> document object model(文档对象模型)
* 解析的时候,将文档整体的读入,并将XML结构化成树状,使用时,通过树枝来获取
* DOM 解析方式比较好的一个实现是Google提供的GData,是开源的,他是对libxml.dylib的封装,也就是说需要导入类库
*
*
第一步, 导入GData文件,配置环境文件,添加libxml2.tbd
第二步, 在bulid setting 中 Head Search Path 中 添加进入 ${SDK_ROOT}/usr/include/libxml2
第三步, 在bulid phases 中第二个中 GData、 JSonKit 中添加 -fno-objc-arc (ARC MRC混编)(下面需要使用Json解析,同样也需要在同一个地方添加同样的语句, 因此都写在这里)
*
- (void)DomXmlAction {
// 模拟从网络上拿到数据
NSString *path = [[NSBundlemainBundle]pathForResource:@"message"ofType:@"txt"];
NSData *data = [NSDatadataWithContentsOfFile:path];
// 开始解析
// 1、创建解析对象
GDataXMLDocument *doc = [[GDataXMLDocumentalloc] initWithData:data options:0error:nil];
// 2、拿到根节点
GDataXMLElement *root = doc.rootElement;
// 拿到子节点
NSArray *modelArray = root.children;
// 初始化data数组
self.data = [NSMutableArrayarray];
// 遍历数组取到每一个model对应的节点
for (GDataXMLElement *modelElein modelArray) {
Person *p = [[Personalloc] init];
// 获得属性节点数组
NSArray *proArray = modelEle.children;
for (GDataXMLElement * proElein proArray) {
[p setValue:proEle.stringValueforKey:proEle.name];
}
[self.dataaddObject:p];
NSLog(@"%@--%@--%@", p.name, p.sex, p.info);
}
}
#pragma mark---------- 使用jsonKit 进行解析 (使用第三方)
- (void)JSONKitAction {
// 模拟从网络上获取数据
NSString *path = [[NSBundlemainBundle]pathForResource:@"Json"ofType:@"txt"];
NSData *data = [NSDatadataWithContentsOfFile:path];
//1 直接从data中拿对象
NSArray *array = [data objectFromJSONData];
//2 初始化数组
self.data = [NSMutableArrayarray];
//3 遍历数组
for (NSDictionary *dicin array) {
Person *p = [[Personalloc] init];
[p setValuesForKeysWithDictionary:dic];
[self.dataaddObject:p];
}
// 循环打印,查看结果
for (Person *pin self.data) {
NSLog(@"%@-- %@ -- %@",p.name, p.sex, p.info);
}
}
#pragma mark---------- 利用系统提供的类进行JSON解析
- (void)JsonSerializationActoin {
// 模拟从网络上获取数据
NSString *path = [[NSBundlemainBundle]pathForResource:@"Json"ofType:@"txt"];
NSData *data = [NSDatadataWithContentsOfFile:path];
NSArray *array = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingAllowFragmentserror:nil];
self.data = [NSMutableArrayarray];
for (NSDictionary *dicin array) {
Person * p = [[Personalloc] init];
[p setValuesForKeysWithDictionary:dic];
[self.dataaddObject:p];
}
for (Person *pin self.data) {
NSLog(@"%@-- %@ -- %@",p.name, p.sex, p.info);
}
}