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(@"关闭文档");
}

版权声明:本文为outlan原创文章,未经博主允许不得转载。

时间: 2024-10-29 18:21:06

XML数据结构 SAX 解析的相关文章

iOS中的数据解析(XML,JSON),SAX解析,DOM解析

第三方 SAT解析 #import "SAXTableViewController.h" #import "Student.h" @interface SAXTableViewController ()<NSXMLParserDelegate> @property (nonatomic, retain) NSMutableArray *dataSourse; // 存储学生对象 @property (nonatomic, retain) Student

XML(十)- SAX解析

XML解析之 SAX解析 SAX介绍 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口. 与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. 当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口. 局限性: 1. SAX分析器在对XML文档进行分析时,触发了一系列的事件,由于事件触发本身是有时序性的,因此,SAX

Android解析XML之SAX解析器

SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的.当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理.在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为. SAX解析器的优点是解析速度快,占用内存少.非常适合在Android移动设备中使用. SAX相关类及API DefaultHandler:是一个事

XML之SAX解析模型

DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢 SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解析,同时根据已经定义好的事件处理器,来决定当前所解析的部分是否有必要进行记录并存储 import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public c

XML的sax解析

1)两种解析方式 dom解析:一次性把整个xml文件读入内容,构建document树. 问题:比较消耗内存     不适合读取大文件 sax解析: 为了解决读取大文件的问题,引入sax解析 原理:读取一点(xml的某个部分),解析一点 sax,simple api for xml 2) sax的api 官方jaxp的sax .  org.xm.sax.* 2.1 读取xml文件 a)创建SAXParserFactory对象 b)获取一个SAXParser对象 c)获取一个XMLReader对象

XML(三)Sax解析XML

  两种解析方式: dom4j 和 sax 解析思想: book2.xml <?xml version="1.0" encoding="UTF-8"?> <书架> <书> <书名>JAVA</书名> <作者>XXXXXX</作者> <售价>23333</售价> </书> <书> <书名>ANDROID</书名>

【文件处理】xml 文件 SAX解析

SAX的全称是Simple APIs for XML,也即XML简单应用程序接口. 与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. 当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口. 局限性: 1. SAX分析器在对XML文档进行分析时,触发了一系列的事件,由于事件触发本身是有时序性的,因此,SAX提供的是一种顺序访问机制,对于已经分析

使用jaxp对比xml进行SAX解析

package cn.itcast.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler;

iOS开发2-使用SAX解析XML数据

XML数据结构和解析 1.1XML数据结构 XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分.可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识别.可分类的信息.创建的文件,或文档实例 由元素(标记)和内容构成.当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档.元素的描述性越强,文档各部分越容易识别.自从出现标记至今,带有标记的内容就有一个优势,即在计算机系统缺失时,仍然可以通过标