iOS SAX解析XML

简介: 先从网络获取XML文件 NSURL *url = [NSURL URLWithString:@"https://127.0.0.1/videos.
  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. 打印查看结果


    img_65409b58afb5d43abae0e169ca0b625b.png
    结果.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>
目录
相关文章
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3163 1
|
8月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
404 0
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
572 15
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
存储 安全 数据安全/隐私保护
深入解析iOS 14隐私保护功能:用户数据安全的新里程碑
随着数字时代的到来,个人隐私保护成为全球关注的焦点。苹果公司在最新的iOS 14系统中引入了一系列创新的隐私保护功能,旨在为用户提供更透明的数据使用信息和更强的控制权。本文将深入探讨iOS 14中的几项关键隐私功能,包括App跟踪透明性、简化的隐私设置以及增强的系统安全性,分析它们如何共同作用以提升用户的隐私保护水平。
942 3
|
数据安全/隐私保护 iOS开发 开发者
iOS 14隐私保护新特性深度解析####
随着数字时代的到来,隐私保护已成为全球用户最为关注的问题之一。苹果在最新的iOS 14系统中引入了一系列创新功能,旨在增强用户的隐私和数据安全。本文将深入探讨iOS 14中的几大隐私保护新特性,包括App跟踪透明度、剪贴板访问通知和智能防追踪功能,分析这些功能如何提升用户隐私保护,并评估它们对开发者和用户体验的影响。 ####
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
898 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1414 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
564 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS