XML数据结构 SAX 解析

SAX解析
SAX:Simple API for XML。基于事件驱动的解析⽅方式,逐⾏行解析 数据。(采⽤用协议回调机制)

NSXMLParser类
NSXMLParser是iOS⾃自带的XML解析类。采⽤用SAX⽅方式解析数据。
解析过程由NSXMLParserDelegate协议⽅方法回调
解析过程:开始标签->取值->结束标签->取值

<?xml version = "1.0" encoding = "UTF-8"?>
<students>
    <student>
        <name>yadong</name>
        <sex>man</sex>
        <phone>18310057255</phone>
    </student>

    <student>
        <name>kelin</name>
        <sex>man</sex>
        <phone>18410057255</phone>
    </student>

    <student>
        <name>marry</name>
        <sex>woman</sex>
        <phone>18510057255</phone>
    </student>
</students>
#import "ViewController.h"
#import "StudentModal.h"

@interface ViewController () <NSXMLParserDelegate>
{
    // 用来记录当前正在操作的标签
    NSString *_currentElement;
}

@property (nonatomic,strong) NSMutableArray *xmlSAXArray;

@end
- (IBAction)XMLSAXBtttonDidClicked:(UIButton *)sender {

    // 1、拿到 xml 文件的路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"myData" ofType:@"xml"];

    // 2、根据文件路径获取文件的内容
    NSData *data = [[NSData alloc] initWithContentsOfFile:path];

    // 3、根据 data 初始化一个 NSXMLParser 对象
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

    // 4、设置 NSXMLParser 对象的相关属性
    // 是否处理命名空间
    [parser setShouldProcessNamespaces:NO];
    // 是否设置报告处理(前缀)
    [parser setShouldReportNamespacePrefixes:NO];

    // 5、设置代理
    parser.delegate = self;

    // 6、开始解析(调用)
    [parser parse];
}

实现 NSXMLParser 代理方法
开始解析(打开文档)

- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    // 初始化数组
    self.xmlSAXArray = [NSMutableArray array];
    NSLog(@"打开文档");
}

打开标签

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"student"]) {
        StudentModal *modal = [[StudentModal alloc] init];
        [self.xmlSAXArray addObject:modal];
    }
    _currentElement = elementName;
    NSLog(@"打开标签%@",elementName);
}

取值

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    StudentModal *modal = [self.xmlSAXArray lastObject];
    if ([_currentElement isEqualToString:@"name"]) {
        modal.name = string;
    } else if ([_currentElement isEqualToString:@"sex"]) {
        modal.sex = string;
    } else if ([_currentElement isEqualToString:@"phone"]) {
        modal.phoneNumber = string;
    }
    NSLog(@"取值%@",string);
}

关闭标签

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { _currentElement = nil; NSLog(@"关闭标签%@",elementName); }

关闭文档

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    // 打印验证
    for (StudentModal *stu in self.xmlSAXArray) {
        NSLog(@"%@,%@,%@",stu.name,stu.sex,stu.phoneNumber);
    }

    NSLog(@"关闭文档");
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇