xml解析

来源:互联网 发布:英语六级听力软件那个 编辑:程序博客网 时间:2024/05/22 22:55

-----------------------------------------第一种解析方式 SAX-------------------------------------------

遵循协议NSXMLParserDelegate

- (IBAction)buttonAction:(UIButton *)sender {
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"];
    
    NSData *data = [NSData dataWithContentsOfFile:path];
    
    //根据data数据化初始化出一个NSXMLParser对象
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
//    4.设置xmlParser的相关属性
    //是否处理命名空间
    [xmlParser setShouldProcessNamespaces:NO];
    //不处理是否报告命名空间
    [xmlParser setShouldReportNamespacePrefixes:NO];
    
//    5.设置代理
    xmlParser.delegate = self;
//    6.开始解析
    [xmlParser parse];
}

#pragma mark 解析开始 打开文档
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
    self.modelArray = [NSMutableArray array];
}

#pragma mark 开始解析 打开标签
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"student"]) {
        Model *model = [[Model alloc] init];
        [self.modelArray addObject:model];
    }
    self.currentElementName = elementName;
    NSLog(@"%@",self.currentElementName);
}

#pragma mark 取值  每走一次标签 无论是打开还是关闭 接下来都会走取值方法 没有值的时候为空
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    Model *model = [self.modelArray lastObject];
    if ([self.currentElementName isEqualToString:@"name"]) {
        model.name = string;
    }else if ([self.currentElementName isEqualToString:@"gender"]) {
        model.gender = string;
    }else if ([self.currentElementName isEqualToString:@"age"]) {
        model.age = string;
    }
}

#pragma mark 关闭标签  执行完后走 取值方法 
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    //否则在下一次打开标签的时候。currentElementName 仍然为上一次的标签,如果判断的话会出错
    self.currentElementName = nil;
}
#pragma mark 解析结束后 关闭文档
-(void)parserDidEndDocument:(NSXMLParser *)parser
{
    for (Model *temp in self.modelArray) {
        NSLog(@"%@",temp.name);
    }
}

-----------------------------------------第二种解析方式 DOM-----------第三方库解析--------------------------------

/*

//GDATA使用前配置
//    1.首先添加 libxml2.dylib这个动态数据库 (build phrases)
//    2.header seach path 里面添加 /usr/include/libxml2 (build setting)
//      Other Linker 里面添加 -lxml2  (build setting)
//    3.如果是ARC工程使用 则在build phrases 里面找到 compile sources 里找到对应 .m 文件 添加编辑约束

// ARC 下用到MRC  -fno-objc-arc  (表示指定的文件编译是不用ARC编译 在build phases 下
//                                                     compile sources )
// MRC 下用到ARC  -fobjc-arc

*/


#pragma mark xmlDOM解析
- (IBAction)XMLdoucmentButtonAction:(UIButton *)sender {
    
    // 初始化数组
    self.XMLDOMArray = [NSMutableArray array];
    
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"xml"];
    NSData *data = [[NSData alloc] initWithContentsOfFile:path];
    
    //根据NSData创建对象
    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    
//    4.取出根节点
    GDataXMLElement *rootElement = [document rootElement];
    NSLog(@"%@",rootElement);
    
//    5.取出所有的student节点
   NSArray *stuElementArray = [rootElement elementsForName:@"student"];
//    6.便利数组 拿到下一层节点
    for (GDataXMLElement *element in stuElementArray) {
        //拿到的是name的节点
        GDataXMLElement *nameELement = [[element elementsForName:@"name"] lastObject];
        //拿到name节点的值
        NSString *name = [nameELement stringValue];
        
        GDataXMLElement *genderELement = [[element elementsForName:@"gender"] lastObject];
        NSString *gender = [genderELement stringValue];
        
        GDataXMLElement *ageElement = [[element elementsForName:@"age"] lastObject];
        NSString *age = [ageElement stringValue];
        
        Model *model = [[Model alloc] init];
        model.name = name;
        model.gender = gender;
        model.age = age;
        
        [self.XMLDOMArray addObject:model];
    }
    
   
    for (Model *model in self.XMLDOMArray) {
        NSLog(@"name:%@  gender:%@  age:%@",model.name,model.gender,model.age);
    }
}



0 0
原创粉丝点击