所谓的解析无非就是:从事先规定好的格式中提取数据。
IOS 开发常见的解析:XML 解析 (用的不是很多, 大约20%左右,一般大项目能用到)、 JSON解析(这个用得非常的多)
XML 数据结构的语法:
一对尖括号代表一个节点,或者标签
只有一个根节点
节点可以互相嵌套
没有子节点的节点称谓叶子节点
让我们在自己的工程中创建一个Property List
<root>
<stu_list>
<stu_array name="A">
<student>
<name>刘喆</name>
<age>18</age>
<tel>120</tel>
</student>
<student>
<name>刘少辉</name>
<age>12</age>
<tel>114</tel>
</student>
</stu_array>
<stu_array name="B">
<student>
<name>龚宁</name>
<age>17</age>
<tel>114</tel>
</student>
<student>
<name>吴东洋</name>
<age>10</age>
<tel>888</tel>
</student>
</stu_array>
</stu_list>
</root>
我们先用代码把 XML 引入进来, 代码如下:
#pragma mark
#pragma Dom 解析
- (void)domParser{
NSString *Path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml" ];
//将这东西转换格式二进制对象
NSData *data = [NSData dataWithContentsOfFile:Path];
// NSError *error = nil;
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:GDataXMLElementKind error:NULL];
GDataXMLElement *root = [doc rootElement];
NSLog(@"root === %@",root);
NSArray *arr = [root elementsForName:@"stu_list"];
GDataXMLElement *stu_list = [arr firstObject];
NSArray *stuarray = [stu_list elementsForName:@"stu_array"];//获得节点名为stu_array的所有节点
for (GDataXMLElement *stuA in stuarray) {
GDataXMLNode *node = [stuA attributeForName:@"name"];
NSString *attStr = [node stringValue];//取节点所对应的内容
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:attStr forKey:@"name"];
NSMutableArray *array = [NSMutableArray array];
[dic setObject:array forKey:@"array"];
[_tableArray addObject:dic];
//获得节点名字为sutdents的所有节点
NSArray *students = [stuA elementsForName:@"student"];
for (GDataXMLElement *stu in students) {
StuModel *model = [[StuModel alloc]init];
[array addObject:model];
[model release];
//获得所有student的子节点
NSArray *children = [stu children];
for (GDataXMLElement *child in children) {
//取出节点内容
NSString *childValue = [child stringValue];
//判断节点名
if ([[child name] isEqualToString:@"name"]) {
model.name = childValue;
} if ([[child name] isEqualToString:@"age"]) {
model.age = childValue;
}if ([[child name] isEqualToString:@"tel"]) {
model.tel = childValue;
}
}
}
}
NSLog(@"arr====%@",stuarray);
}
执行解析协议
@interface SaxXmlParser : NSObject<NSXMLParserDelegate>{
NSMutableArray *_stuArray;
}
@property (nonatomic,retain)NSString *currentValue;
@property (nonatomic,assign)id<SaxmlParserDelegate>delegate;
- (void)startParser;
解析的具体过程
//sax 解析啦
- (void)startParser{
//找路径 在BUNDLE包里
NSString *Path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml" ];
//将这东西转换格式二进制对象
NSData *data = [NSData dataWithContentsOfFile:Path];
//初始化
NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithData:data];
xmlParser.delegate = self;
[xmlParser parse];//执行解析
}
static NSString *kRoot = @"root";
static NSString *kStuArray = @"stu_array";
static NSString *kStudent = @"student";
static NSString *kName = @"name";
static NSString *kAge = @"age";
static NSString *kTel = @"tel";
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
// NSLog(@"parser=====%@,elementName======%@,namespaceURT ======%@,qName========%@,attributeDict=======%@",parser,elementName,namespaceURI,qName,attributeDict);
// NSLog(@"%s======3",__func__);
if ([elementName isEqualToString:kStuArray]) {
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic addEntriesFromDictionary:attributeDict];//把另外一个字典所有内容取出来放在领一个字典内
NSMutableArray *arr = [NSMutableArray array];
[dic setObject:arr forKey:@"array"];
[_stuArray addObject:dic];//把整体的字典给大数组
}
if ([elementName isEqualToString:kStudent]) {
StuModel *model = [[StuModel alloc] init];
NSMutableDictionary *lastDic = [_stuArray lastObject];
NSMutableArray *lastArr = [lastDic objectForKey:@"array"];
[lastArr addObject:model];
[model release];
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"parser======%@,string=======%@",parser,string);
NSLog(@"%s=====1",__func__);
self.currentValue = string;
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if ([elementName isEqualToString:kName]) {//名字判断
NSMutableDictionary *dic = [_stuArray lastObject];
NSMutableArray *array = [dic objectForKey:@"array"];
StuModel *model = [array lastObject];
model.name = _currentValue;
}
if ([elementName isEqualToString:kAge]) {//年龄判断
NSMutableDictionary *dic1 = [_stuArray lastObject];
NSMutableArray *array = [dic1 objectForKey:@"array"];
StuModel *model1 = [array lastObject];
model1.age = _currentValue;
}
if ([elementName isEqualToString:kTel]) {//手机判断
NSMutableDictionary *dic1 = [_stuArray lastObject];
NSMutableArray *array = [dic1 objectForKey:@"array"];
StuModel *model1 = [array lastObject];
model1.tel = _currentValue;
}
if ([elementName isEqualToString:kRoot]) {
NSLog(@"stuArray===========%@",_stuArray);
[self.delegate parserFinished:_stuArray];
}
NSLog(@"%s=======2",__func__);
}