Senior进阶 网络之数据解析之XML解析和JSON解析的用法
XML解析之SAX解析
首先在视图控制器的.m文件延展中声明下列属性
//存放所有的student节点
@property (nonatomic,strong)NSMutableArray* allDataMArray;
//将一个student转换为字典
@property (nonatomic,strong)NSMutableDictionary *studentMDic;
//存储节点中的值
@property (nonatomic,strong) NSString *noteValueString;
//SAX解析学习
- (void)saxParser{
//SAX解析:基于事件驱动的解析方式,逐行解析
//第一步:获取文件的地址
NSString* xmlPath = [[NSBundle mainBundle] pathForResource:@"demoXML1" ofType:@"xml"];
//获取文件内容
NSString* xmlString = [NSString stringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncoding error:nil];
//字符串转data类型
NSData* xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
//获取解析对象
//参数:需要解析的文件内容
NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithData:xmlData];
//设置代理
xmlParser.delegate = self;
//开始解析,parser解析的过程为同步,当整个解析完成了,才会执行下一行的代码。
BOOL isSuccess = [xmlParser parse];
if (isSuccess) {
NSLog(@"数据解析成功");
}else{
NSLog(@"数据解析失败");
}
//解析的过程不结束,就不会执行该打印
NSLog(@"我在解析的最底下");
}
#pragma mark ---- parser 解析的代理方法
//开始解析整个文档了
- (void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"开始解析整个文档了");
//初始化外部的可变数组,准备存放解析好的student节点
self.allDataMArray = [[NSMutableArray alloc] init];
}
//当碰到开始节点或者开始标签的时候会执行的代理方法
//第一个参数:解析对象
//第二个参数:elementName:标签名称 例如:<name> name就是标签名(节点名)
//第三个参数:namespaceURI:命名空间的标识符 例如:<teacher xml:l="www.lanou3g.com">,namespaceURI就是 l
//第四个参数:qualifiedName:命名空间的值,就是上面的 www.lanou3g.com
//第五个参数:attributeDict(字典类型):标签的属性 例如<student position="愤青">position就是标签的属性 attributeDict = {position:"愤青"}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
NSLog(@"碰到开始标签----- %@",elementName);
//当开始解析student节点的时候,说明我们要用到字典了,需要对字典进行初始化
if ([elementName isEqualToString:@"student"]) {
self.studentMDic = [[NSMutableDictionary alloc] init];
}
}
//取出标签中的值
//参数为:标签中的值
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"正在解析的标签的值为----- %@",string);
//将结点的内容存储起来,以供节点解析结束时使用
self.noteValueString = string;
}
//遇到当前正在解析的标签的结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"%@标签已经解析结束",elementName);
//
if ([elementName isEqualToString:@"name"]) {
//说明name标签解析结束
[self.studentMDic setObject:self.noteValueString forKey:elementName];
}
if ([elementName isEqualToString:@"age"]) {
//说明age标签解析结束
[self.studentMDic setObject:self.noteValueString forKey:elementName];
}
if ([elementName isEqualToString:@"gender"]) {
//说明gender标签解析结束
[self.studentMDic setObject:self.noteValueString forKey:elementName];
}
if ([elementName isEqualToString:@"student"]) {
//说明一个student已经解析完成,说明一个字典已经完整,应该将字典存放到数组中
[self.allDataMArray addObject:self.studentMDic];
}
}
//整个文档解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"整个文档解析结束");
//当整个文档解析结束,说明所有的数据我们已经拿到,可以正常使用
NSLog(@"self.allDataMArray ---- %@",self.allDataMArray);
}
//当解析出错的时候执行的代理方法
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"解析出现错误 ----- %@",parseError.description);
}
XML解析之DOM解析
第一步:导入GDataXMLNode的(.h和.m)文件
第二步:根据要求配置使用方法
第三步:解析文件
//DOM解析的学习 基于文档驱动的解析方式
- (void)domParser{
//需要获取解析的源文件
//第一步:获取文件的地址
NSString* xmlPath = [[NSBundle mainBundle] pathForResource:@"demoXML1" ofType:@"xml"];
//获取文件内容
NSString* xmlString = [NSString stringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncoding error:nil];
//字符串转data类型
NSData* xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
//DOM解析
//第一步:将源XML转换成树状结构的文档放在内存中,以供遍历获取每一个节点
GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc] initWithData:xmlData encoding:NSUTF8StringEncoding error:nil];
//第二步:获取根节点 相当于获取到了students节点
GDataXMLElement *rootElement = [xmlDocument rootElement];
//向现有的文档动态添加一个student节点
//student节点的创建 相当于<student></student>
GDataXMLElement* studentNote = [GDataXMLElement elementWithName:@"student"];
//为student增加子节点
GDataXMLElement* nameNote = [GDataXMLElement elementWithName:@"name" stringValue:@"ze an"];
//添加到studentNote
[studentNote addChild:nameNote];
//为student增加age子节点
GDataXMLElement *ageNote = [GDataXMLElement elementWithName:@"age"];
ageNote.stringValue = @"22";
//添加到studentNote节点上
[studentNote addChild:ageNote];
//为studentNote增加gender子节点
GDataXMLElement *genderNote = [GDataXMLElement elementWithName:@"gender" stringValue:@"man"];
//添加到studentNote上
[studentNote addChild:genderNote];
//将student节点加入到它的父节点中
[rootElement addChild:studentNote];
//第三步:获取我们需要的子节点
//参数;我们需要获取的子节点的标签名
NSArray *studentMArray = [rootElement elementsForName:@"student"];
//初始化一个可变数组,准备存放所有的student转换成的字典
NSMutableArray *allStudentsArray = [[NSMutableArray alloc] init];
//第四步:遍历studentArray
//studentNode 对应一个student节点
/*
<student>
<name></name>
<age></age>
<gender></gender>
</studnet>
*/
//第一种:
//没执行一次 循环体,就相当于获取了一个完整的student节点,结构如上
// for (GDataXMLElement *studentNote in studentMArray) {
// //�初始化一个字典
// NSMutableDictionary *studentDic = [[NSMutableDictionary alloc] init];
// //
//// NSString *name = [[[studentNote elementsForName:@"name"] firstObject] stringValue];
// //获取name的节点
// GDataXMLElement* nameElement = [studentNote elementsForName:@"name"].firstObject;
// //取出节点中的值
// NSString *name = nameElement.stringValue;
// //将name的值放入字典中
// [studentDic setObject:name forKey:@"name"];
//
// //获取age节点
// GDataXMLElement* ageElement = [studentNote elementsForName:@"age"].firstObject;
// //取出节点中的值
// NSString *age = ageElement.stringValue;
// //将age的值放入字典中
// [studentDic setObject:age forKey:@"age"];
//
// //获取gender节点
// GDataXMLElement* genderElement = [studentNote elementsForName:@"gender"].firstObject;
// //取出节点中的值
// NSString *gender = genderElement.stringValue;
// //将age的值放入字典中
// [studentDic setObject:gender forKey:@"gender"];
//
// //将字典添加到可变数组中
// [allStudentsArray addObject:studentDic];
// }
//第二种
for (GDataXMLElement *studentNote in studentMArray) {
//遍历获取student所有的子节点
NSArray *subStudentNode = [studentNote children];
//初始化一个可变字典
NSMutableDictionary *studentDic = [[NSMutableDictionary alloc] init];
//遍历
for (GDataXMLElement* subOfStudentNote in subStudentNode) {
//获取节点的名称
NSString *noteName = [subOfStudentNote name];
//获取节点的值
NSString *noteValue = [subOfStudentNote stringValue];
//将值添加到字典中
[studentDic setObject:noteValue forKey:noteName];
}
//将字典加入到可变数组中
[allStudentsArray addObject:studentDic];
}
NSLog(@"allStudentsArray ---- %@",allStudentsArray);
}
JSON解析
//JSON解析
- (void)jsonParser{
//获取源文件
NSString* jsonPath = [[NSBundle mainBundle] pathForResource:@"DemoJson" ofType:@"json"];
//
NSString* jsonString = [NSString stringWithContentsOfFile:jsonPath encoding:NSUTF8StringEncoding error:nil];
//字符串转换为二进制类型
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
//Json解析
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
NSLog(@"dic ==== %@",dic);
}
网友评论