XML解析:一、SAX解析

XML

Extensible Markup Language(可扩展的标记语言),主流数据之一,可用来存储和传输数据。
XML的作用:
1.配置文件
2.内容管理
3.数据交换

XML的解析方式有两种:SAX解析 DOM解析 (安卓有一个PULL)。

SAX解析:
simple API for XML
基于事件机制的解析方式,采用逐行解析数据(采用协议回调机制)

工程创建:

1、Xcode下创建:

XML解析:一、SAX解析_第1张图片

在Message.txt下写一个简单的标准格式样板,如下:


<Persons>
    <person>
        <name>张三name>
        <sex>sex>
    person>
    <person>
       <name>李四name>
       <sex>sex>
    person>
    <person>
        <name>王五name>
        <sex>sex>
     person>
Persons>

2、在控制文件 .h 文件中声明三个属性

@property (nonatomic, strong) NSMutableArray *data;
@property (nonatomic, copy) NSString *currentElement;
@property (nonatomic, strong) NSMutableString *tempString;

注:
声明一个可变字符串 tempString的原因:
使用XML解析,如果解析内容中出现以数字开头的信息,如:2016年1月,
它会先解析出“2016”,然后重新解析,得出“年1月”。所以要加一个可变字符串,在解析中进行字符串的拼接,否则“年1月”会将“2016”这个信息覆盖掉。

3、开始解析:
1)创建一个Person类的model,包含:name,sex。
2)在控制文件中引入协议
@interface RootViewController ()


- (void)viewDidLoad {
    [super viewDidLoad];
    [self.rv.button1 addTarget:self action:@selector(saxXmlAction) forControlEvents:UIControlEventTouchUpInside];

- (void)saxXmlAction{
    //模拟从网路上拿到数据
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Message" ofType:@"txt"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    //开始解析
    //创建解析对象,绑定数据
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    //指定代理
    parser.delegate = self;
    //开始解析
    [parser parse];
}

//实现代理的方法
-(void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"开始解析文档");
    self.data = [NSMutableArray array];
}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    NSLog(@"开始解析标签");
    if ([elementName isEqualToString:@"person"]) {
        Person *p = [[Person alloc] init];
        [self.data addObject:p];
    }
    self.currentElement = elementName;
    self.tempString = [NSMutableString string];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    NSLog( @"解析中间数据项");
    [self.tempString appendString:string];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    Person *p = [self.data lastObject];
    //利用KVC进行属性赋值
    [p setValue:self.tempString forKey:self.currentElement];

    NSLog(@"结束解析标签");
    self.currentElement = nil;
    self.tempString = nil;
}

- (void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"结束解析文档");
    for (Person *p in self.data) {
        NSLog(@"%@--%@", p.name, p.sex);
    }
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
    NSLog(@"OMG,文档有毒");
    }

你可能感兴趣的:(iOS)