iOS SAX解析XML

  1. 先从网络获取XML文件
    NSURL *url = [NSURL URLWithString:@"https://127.0.0.1/videos.xml"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:
     ^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
         if (connectionError) {
             NSLog(@"连接错误 %@", connectionError);
             return;
         }
         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
         if (httpResponse.statusCode == 200 || httpResponse.statusCode == 304) {
             // 解析数据
             
         } else {
             NSLog(@"服务器内部错误");
         }
     }];
  1. 在注释为解析数据处开始解析网络获取的数据
            // 给ViewController添加代理
          @interface ViewController () <NSXMLParserDelegate>

          @end
             // 解析数据
            NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
            // 设置代理
             parser.delegate = self;
            // 开始执行代理方法
             [parser parse];
  1. 实现代理方法
// 1. 开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"1开始解析");
}

// 2. 找开始节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    NSLog(@"2找开始节点 %@--%@", elementName, attributeDict);
}

// 3. 找节点之间的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"3找节点之间的内容 %@", string);
}

// 4. 找结束节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSLog(@"4找结束节点 %@", elementName);
}

// 5. 结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"5结束解析");
}

// 6. 解析出错
- (void) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"解析出错");
}

  1. 构建实体类
    Video.h
#import <Foundation/Foundation.h>

@interface Video : NSObject
@property (nonatomic, strong) NSNumber *videoId;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSNumber *length;
@property (nonatomic, copy) NSString *videoURL;
@property (nonatomic, copy) NSString *imageURL;
@property (nonatomic, copy) NSString *desc;
@property (nonatomic, copy) NSString *teacher;

@property (nonatomic, readonly) NSString *time;

- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)videoWithDict:(NSDictionary *)dict;

@end

video.m

#import "Video.h"

@implementation Video

- (instancetype)initWithDict:(NSDictionary *)dict {
    if (self = [super init]) {
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}

+ (instancetype)videoWithDict:(NSDictionary *)dict {
    return [[self alloc] initWithDict:dict];
}

- (NSString *)time {
    int len = self.length.intValue;
    return [NSString stringWithFormat:@"%02d:%02d:%02d:", len / 3600, (len %3600) / 60, (len % 60) ];
}

- (NSString *)description {
    return [NSString stringWithFormat:@"<%@ : %p> { videoId : %@, name : %@, length : %@, videoURL : %@, imageURL : %@, desc : %@, teacher : %@}", [self class], self, self.videoId, self.name, self.length, self.videoURL, self.imageURL, self.desc, self.teacher];
}

@end
  1. XML解析成对象
@interface ViewController () <NSXMLParserDelegate>
// 保存XML数据
@property (nonatomic, strong) NSMutableArray *videos;
// 当前创建的video对象
@property (nonatomic, strong) Video *video;
// 保存当前节点内容
@property (nonatomic, copy) NSMutableString *string;
@end

@implementation ViewController

// 懒加载
- (NSMutableArray *)videos {
    if (_videos == nil) {
        _videos = [NSMutableArray arrayWithCapacity:10];
    }
    return _videos;
}

- (NSMutableString *)string {
    if (_string == nil) {
        _string = [NSMutableString string];
    }
    return _string;
}
@end
  1. 在video节点时创建Video对象
// 2. 找开始节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    NSLog(@"2找开始节点 %@--%@", elementName, attributeDict);
    
    // 如果是video标签,创建video对象
    if ([elementName isEqualToString:@"video"]) {
        self.video = [[Video alloc] init];
        self.video.videoId = @([attributeDict[@"videoId"] intValue]);
        // 添加到数组中
        [self.videos addObject:self.video];
    }
}

  1. 拼接保存每个节点中的内容
// 3. 找节点之间的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"3找节点之间的内容 %@", string);
    [self.string appendString:string];
}
  1. 将内容与对应的节点赋值,并将string对象置空
// 4. 找结束节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSLog(@"4找结束节点 %@", elementName);
    // 判断标签是否有对应的属性
    if (![elementName isEqualToString:@"video"] && ![elementName isEqualToString:@"videos"]) {
        // 为节点赋值
        [self.video setValue:self.string forKey:elementName];
    }
    // 清空字符串
    [self.string setString:@""];
}
  1. 打印查看结果


    结果.png
videos.xml内容
<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>
<video videoId="7">
<name>07.C语言-字符串</name>
<length>848</length>
<videoURL>/itcast/videos/07.C语言-字符串.mp4</videoURL>
<imageURL>/itcast/images/head7.png</imageURL>
<desc>C语言-字符串</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="8">
<name>08.C语言-指针</name>
<length>502</length>
<videoURL>/itcast/videos/08.C语言-指针.mp4</videoURL>
<imageURL>/itcast/images/head8.png</imageURL>
<desc>C语言-指针</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="9">
<name>09.C语言-指针用例</name>
<length>558</length>
<videoURL>/itcast/videos/09.C语言-指针用例.mp4</videoURL>
<imageURL>/itcast/images/head1.png</imageURL>
<desc>C语言-指针用例</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="10">
<name>10.C语言-指针与数组</name>
<length>1682</length>
<videoURL>/itcast/videos/10.C语言-指针与数组.mp4</videoURL>
<imageURL>/itcast/images/head2.png</imageURL>
<desc>C语言-指针与数组</desc>
<teacher>韩梅梅</teacher>
</video>
<video videoId="11">
<name>11.C语言-指针与字符串</name>
<length>1092</length>
<videoURL>/itcast/videos/11.C语言-指针与字符串.mp4</videoURL>
<imageURL>/itcast/images/head3.png</imageURL>
<desc>C语言-指针与字符串</desc>
<teacher>韩梅梅</teacher>
</video>
</videos>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343