XML的数据解析
1.先设置一个开始解析的方法 2.把处理好的数据学生放到数组里,然后直接使用数组就可以了
// 先设置一个开始解析的方法
- (void)startParser;
// 把处理好的数据学生,放到数组里,然后直接使用数组就可以
@property(nonatomic, retain)NSMutableArray *stuArr;
2.开始解析的方法----->1.先找到文件路径 2.把路径对应的文件转换成NSData 3.创建一个XML文件 4.设置代理人 5.开始解析
- (void)startParser{
// 先找到文件的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
// 把路径对应的文件转换成NSData
NSData *data = [NSData dataWithContentsOfFile:path];
// 创建一个xml解析工具
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
// 设置代理人
parser.delegate = self;
// 开始解析
[parser parse];
}
3.协议方法,开始解析,执行协议方法didse 1.根据不同的节点名,进行不同的操作 2.小的student里创建一个学生对象
#pragma mark 开始解析,执行协议方法
// didsE
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
// 根据不同的节点名,进行不同的操作
if ([elementName isEqualToString:@"Student"]) {
self.stuArr = [NSMutableArray array];
} else if ([elementName isEqualToString:@"student"]){
// 小的student, 创建一个学生对象
Student *stu = [[Student alloc] init];
[self.stuArr addObject:stu];
}
}
4.通过这个协议方法能找到标签之间的内容,但是标签之间如果夹的还是标签,则没有任何内容 这个方法只要找到节点内容就会触发
#pragma mark 通过这个协议方法能找到标签之间的内容,但是标签之间如果夹的还是标签,则没有任何内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
// 这个方法只要找到节点内容就会触发
self.tempStr = string;
}
5.当节点结束的时候,就会执行这个方法 先找到没有设置好的学生,(数组的最后一个) 用KVC的方法赋值
#pragma mark 当节点结束的时候,就会执行这个方法
// 第一个方法
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
// 先找到没有设置好的学生
Student *stu = [self.stuArr lastObject];
// KVC方法,赋值
[stu setValue:self.tempStr forKey:elementName];
}
DOM(需要用三方) 前两部和parser一样(可以写成加号方法)
- (void)startDom;
@property(nonatomic, retain)NSMutableArray *stuArr;
// 加号方法
+ (NSMutableArray *)startXMLDom;
先获取路径,
然后创建对象(创建对象的三个参数,参数一:需要处理数据 参数二:没有0就行 参数三:错误信息)
先到数据的根节点 根据根节点,找到所有的student的节点
- (void)startDom{
// 先获取路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
// 创建对象
// 参数一:需要处理数据
// 参数二:没什么用, 0就行
// 参数三:错误信息
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
// 找到数据的根节点
GDataXMLElement *rootRlement = [document rootElement];
// 根据根节点,找到所有的student的节点
NSArray *arr = [rootRlement elementsForName:@"student"];
// 先对属性数组进行初始化
self.stuArr = [NSMutableArray array];
// 遍历数组
for (NSInteger i = 0; i < arr.count; i++) {
// 创建一个学生对象
Student *stu = [[Student alloc] init];
// 找到每一个student节点对应的内容
GDataXMLElement *stuElement = arr[i];
// 根据节点名,对student节点里的内容进行获取
GDataXMLElement *name = [[stuElement elementsForName:@"name"] lastObject];
// 对学生姓名进行赋值
stu.name = [name stringValue];
[self.stuArr addObject:stu];
}
}
+ (NSMutableArray *)startXMLDom{
// 先获取路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:path];
GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
GDataXMLElement *rootRlement = [document rootElement];
NSArray *arr = [rootRlement elementsForName:@"student"];
NSMutableArray *stuArr = [NSMutableArray array];
for (NSInteger i = 0; i < arr.count; i++) {
Student *stu = [[Student alloc] init];
GDataXMLElement *stuElement = arr[i];
GDataXMLElement *name = [[stuElement elementsForName:@"name"] lastObject];
stu.name = [name stringValue];
[stuArr addObject:stu];
}
return stuArr;
}