iOS用SAX方式解析XML

本文通过一个具体的案例展示了如何使用SAX方式解析XML文件。包括创建解析器、设置代理、执行解析等步骤,并详细解释了关键的代理方法,如开始文档、开始元素、读取内容、结束元素和结束文档等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么都不说直接上代码.


//SAX解析XML关键方法
    //创建xml解析对象
    NSXMLParser* parser = [[NSXMLParser alloc]initWithData:data];
            //设置代理
            parser.delegate = self;
            //执行解析
            [parser parse];




下面是SAX解析的关键代理方法

//1.准备解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"开始解析文档了");

}

/**
 *  2.开始一个新的标签
 *
 *  @param parser
 *  @param elementName   标签的名字
 *  @param namespaceURI
 *  @param qName
 *  @param attributeDict 标签属性(字典)
 */
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{

    NSLog(@"2--elementName = %@--attributeDict = %@",elementName,attributeDict);

}

//3.读出标签中的内容(这里注意标签中的内容不是一次性取出的,有可能是多次,一般都是多次)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    NSLog(@"3--标签中的内容----%@",string);

}


/**
 *  4.结束这个标签
 *
 *  @param parser       自己
 *  @param elementName  标签名
 *  @param namespaceURI
 *  @param qName
 */
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{

    NSLog(@"4--elementName = %@",elementName);


}

//5结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser{

    NSLog(@"文档解析结束了");

}


// 解析出错的时候调用
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"出错");
}


下面是我自己的一个例子,大家没事可以试试

需要解析的XML

<?xml version="1.0" encoding="utf-8"?>
<videos>
    <video videoId="1">
    <name>01.C语言-语法预览</name>
    <length>320</length>
    <videoURL>/itcast/videos/01.C语言-语法预览.mp4</videoURL>
    <imageURL>/itcast/images/head1.png</imageURL>
    <desc>C语言-语法预览</desc><teacher>李雷</teacher>
</video>
<video videoId="2">
    <name>02.C语言-第一个C程序</name>
    <length>2708</length>
    <videoURL>/itcast/videos/02.C语言-第一个C程序.mp4</videoURL>
    <imageURL>/itcast/images/head2.png</imageURL>
    <desc>C语言-第一个C程序</desc>
    <teacher>李雷</teacher>
</video>
<video videoId="3">
    <name>03.C语言-函数</name>
    <length>822</length>
    <videoURL>/itcast/videos/03.C语言-函数.mp4</videoURL>
    <imageURL>/itcast/images/head3.png</imageURL>
    <desc>C语言-函数</desc>
    <teacher>韩梅梅</teacher>
</video>
<video videoId="4">
    <name>04.C语言-基本数据类型</name>
    <length>1113</length><
    videoURL>/itcast/videos/04.C语言-基本数据类型.mp4</videoURL>
    <imageURL>/itcast/images/head4.png</imageURL>
    <desc>C语言-基本数据类型</desc>
    <teacher>韩梅梅</teacher>
</video>
<video videoId="5">
    <name>05.C语言-基本运算</name>
    <length>594</length>
    <videoURL>/itcast/videos/05.C语言-基本运算.mp4</videoURL>
    <imageURL>/itcast/images/head5.png</imageURL>
    <desc>C语言-基本运算</desc>
    <teacher>韩梅梅</teacher>
</video>
<video videoId="6">
    <name>06.C语言-数组</name>
    <length>923</length>
    <videoURL>/itcast/videos/06.C语言-数组.mp4</videoURL>
    <imageURL>/itcast/images/head6.png</imageURL>
    <desc>C语言-数组</desc><
    teacher>韩梅梅</teacher>
</video>
</videos>
//模型文件Model.h

#import <Foundation/Foundation.h>

@interface Model : NSObject


@property (copy,nonatomic) NSNumber* videoId;

@property (copy,nonatomic) NSString* name;

@property (copy,nonatomic) NSNumber* length;

@property (copy,nonatomic) NSString* videoURL;

@property (copy,nonatomic) NSString* imageURL;

@property (copy,nonatomic) NSString* desc;

@property (copy,nonatomic) NSString* teacher;

@end

//模型.m文件

#import "Model.h"

@implementation Model

-(NSString *)description{

    NSMutableString* s = [NSMutableString string];

    [s appendString:[super description]];

    [s appendFormat:@"videoId = %@,name = %@,length = %@,videoURL = %@",self.videoId,self.name,self.length,self.videoURL];

    return s.copy;
}

@end

控制器内解析文件


#import "ViewController.h"
#import "Model.h"

@interface ViewController ()<NSXMLParserDelegate>

@property (strong,nonatomic) Model* currentModel;

@property (strong,nonatomic) NSMutableString* mString;

@property (strong,nonatomic) NSMutableArray* models;

@end

@implementation ViewController

-(NSMutableArray *)models{

    if(!_models){

        _models = [NSMutableArray arrayWithCapacity:10];

    }
    return _models;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    //这里的XML的本地服务器的
    NSURL* url = [NSURL URLWithString:@"http://127.0.0.1/videos.xml"];

    NSMutableURLRequest* request  =[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {

        if (connectionError) {
            NSLog(@"网络连接错误了");
            return ;
        }

        NSHTTPURLResponse* httpRespones = (NSHTTPURLResponse *)response;

        if (httpRespones.statusCode == 200 || httpRespones.statusCode == 304) {
            // 成功解析数据

            NSXMLParser* parser = [[NSXMLParser alloc]initWithData:data];

            parser.delegate = self;

            [parser parse];

        }else{

            //失败了
            NSLog(@"请求失败了:%ld",httpRespones.statusCode);

        }
    }];

}

//1.准备解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"开始解析文档了");

}

/**
 *  2.开始一个新的标签
 *
 *  @param parser
 *  @param elementName   标签的名字
 *  @param namespaceURI
 *  @param qName
 *  @param attributeDict 标签属性(字典)
 */
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict{


    if ([elementName isEqualToString:@"video"]) {
        self.currentModel = [[Model alloc]init];
        self.currentModel.videoId = @([attributeDict[@"videoId"] intValue]);
    }

    NSLog(@"2--elementName = %@--attributeDict = %@",elementName,attributeDict);
        //给videoId赋值


    self.mString = [NSMutableString string];

}

//3.读出标签中的内容(这里注意标签中的内容不是一次性取出的,有可能是多次,一般都是多次)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    NSLog(@"3--标签中的内容----%@",string);

    //拼接成一个完整的语句
    [self.mString appendString:string];

}


/**
 *  4.结束这个标签
 *
 *  @param parser       自己
 *  @param elementName  标签名
 *  @param namespaceURI
 *  @param qName
 */
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName{



    NSLog(@"4--elementName = %@",elementName);

    if ([elementName isEqualToString:@"video"]) {
        [self.models addObject:self.currentModel];
        self.currentModel = nil;
        return;
    }

    [self.currentModel setValue:self.mString forKey:elementName];

    self.mString = nil;


}

//5结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser{

    NSLog(@"文档解析结束了");

    NSLog(@"%@",self.models);

}


// 解析出错的时候调用
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"出错");
}

程序运行结果
代理方法调用顺序

数组输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值