IOS网友们的篇章iOS 开发继续加油iOS 开发~项目常用,经典内容收集

iOS下XML文件的三种解析方式

2016-09-06  本文已影响7481人  Bestmer

前言

在iOS开发中,数据解析通常有两种方式,一种是JSON解析,一种是XML解析。今天着重讲解一下XML文件解析的三种方式。



准备工作

#import <Foundation/Foundation.h>

@interface Student : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *gender;
@property (nonatomic, copy) NSString *age;
@property (nonatomic, copy) NSString *nickname;

@end
#import "Student.h"

@implementation Student

- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    
}

@end


#import "ViewController.h"
#import "Student.h"
#import "GDataXMLNode.h"
#import "XMLReader.h"


@interface ViewController ()

<
    NSXMLParserDelegate
>

@property (nonatomic, retain) NSMutableArray *studentArray;
// 用来记录当前xml解析的节点名称
@property (nonatomic, copy) NSString *currentElementName;

@end

方式一:SAX解析

#pragma mark - SAX解析

// SAX 逐行解析
- (IBAction)saxAction:(id)sender {
    
    NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:@"Demo.xml" ofType:nil];
    NSData *xmlData = [NSData dataWithContentsOfFile:xmlFilePath];
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:xmlData];
    xmlParser.delegate = self;
    
    //  开始解析
    [xmlParser parse];
}

# pragma mark - 协议方法

// 开始
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    
    NSLog(@"开始");

    self.studentArray = [NSMutableArray array];
    
}

// 获取节点头
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    
    NSLog(@"start element : %@", elementName);
    
    self.currentElementName = elementName;
    
    if ([elementName isEqualToString:@"student"]) {
        Student *stu = [[Student alloc] init];
        [_studentArray addObject:stu];
    }
    
}

// 获取节点的值 (这个方法在获取到节点头和节点尾后,会分别调用一次)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    
    NSLog(@"value : %@", string);
    
    if (_currentElementName != nil) {
        Student *stu = [_studentArray lastObject];
        [stu setValue:string forKey:_currentElementName];
    }
}

// 获取节点尾
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    
    _currentElementName = nil;
    NSLog(@"end element :%@", elementName);
    
}

// 结束
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    
    NSLog(@"结束");
    NSLog(@"%@",_studentArray);

}


方式二:DOM解析



/usr/include/libxml2

-fno-objc-arc

# pragma mark - DOM按节点解析

- (IBAction)domAction:(id)sender {
    self.studentArray = [NSMutableArray array];
    
    NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:@"Demo.xml" ofType:nil];
    NSData *xmlData = [NSData dataWithContentsOfFile:xmlFilePath];
    
    NSError *error = nil;
    
    GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
    
    if (error) {
        NSLog(@"error : %@", error);
        return;
    }
    // 取根节点
    GDataXMLElement *rootElement = [xmlDocument rootElement];
    // 获取根节点下的所有子节点
    NSArray *elementArray =  rootElement.children;
    for (GDataXMLElement *studentElement in elementArray) {
        
        Student *stu = [[Student alloc] init];
        [_studentArray addObject:stu];
        
        for (GDataXMLElement *attributeElement in studentElement.children) {
            [stu setValue:attributeElement.stringValue forKey:attributeElement.name];
        }
        
    }
    NSLog(@"array : %@", _studentArray);
}

@end

第三种方式:XMLReader解析

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *xmlFileString = [[NSBundle mainBundle] pathForResource:@"Demo" ofType:@"xml"];
    NSData *xmlData = [NSData dataWithContentsOfFile:xmlFileString];
    NSError *error = nil;
    if (error) {
        
        NSLog(@"error : %@", error);
    }
    
    NSDictionary *result = [XMLReader dictionaryForXMLData:xmlData error:&error];
    NSLog(@"result : %@", result);
}

总结

上一篇 下一篇

猜你喜欢

热点阅读