XML和son的数据解析

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;
}










































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值