SAX for XML

#import "ViewController.h"
#import "VideoModel.h"

@interface ViewController () <NSXMLParserDelegate>

@end

@implementation ViewController {

    /// 模型数组
    NSMutableArray *_videoM;
    /// 拼接节点之间的内容
    NSMutableString *_stringM;
    /// 定义全局的模型
    VideoModel *_currentModel;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    /// 实例化模型数组
    _videoM = [NSMutableArray array];
    _stringM = [NSMutableString string];

    [self loadData];
}

- (void)loadData
{
    // 1.URL
    NSURL *URL = [NSURL URLWithString:@"http://localhost/videos.xml"];

    // 2.session发起和启动任务
    [[[NSURLSession sharedSession] dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        // 3.处理了响应
        if (error == nil && data != nil) {

            // 反序列化 : SAX方式解析XML
            // 1.创建XML解析器
            NSXMLParser *XMLParser = [[NSXMLParser alloc] initWithData:data];
            NSXMLParser *xmlparser = [[NSXMLParser alloc]initWithData:data];
            // 2.遵守XML解析器
            XMLParser.delegate = self;
            // 3.开启解析器
            [XMLParser parse];

        } else {
            NSLog(@"%@",error);
        }

    }] resume];
}

#pragma mark - NSXMLParserDelegate

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

/// 提示 : 代理方法的2-3-4一直在循环的解析XML!!!!!

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

    // 只有找到<video>标签时,才创建`对应`的模型对象
    if ([elementName isEqualToString:@"video"]) {
        // 创建<video>标签`对应`的模型对象
        _currentModel = [[VideoModel alloc] init];
        // 给模型的videoId属性赋值 : 因为只有在这里可以拿到videoId
        _currentModel.videoId = attributeDict[@"videoId"];
        // 把创建的模型对象添加到模型数组videoM
        [_videoM addObject:_currentModel];
    }
}

// 3.找节点之间内容 : 并非一次都能够找全的,完整的节点之间的内容需要拼接
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    // string : 节点之间的内容
//    NSLog(@"3.找节点之间内容 = %@",string);

    // 循环拼接节点之间的内容 : 给模型的属性赋值完之后,一定要清空一次
    [_stringM appendString:string];
}

// 4.找结束节点 : 能够找到结束节点,说明节点之间的内容已经肯定找全了
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName
{
    // elementName : 结束节点名称
//    NSLog(@"4.找结束节点 = %@",elementName);

    // 每次找到一个结束节点,就给模型的属性付一次值;但是,<videos>和<video>标签不能赋值
    if ([elementName isEqualToString:@"videos"] || [elementName isEqualToString:@"video"]) {
        return;
    }

    // 排除了不能给模型赋值的节点之后,剩下的都是可以正常给模型属性赋值的节点
    [_currentModel setValue:_stringM forKey:elementName];

    // 清空拼接字符串的容器
    [_stringM setString:@""];

    // 这样写相当于把不可变的字符串,赋值给可变的字符串
//    _stringM = @"";

    // 这样写相当于把_stringM销毁了
//    _stringM = nil;
}

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

    NSLog(@"%@",_videoM);
}

// 6.监听解析是否出错
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"6.监听解析是否出错 = %@",parseError);
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Libxml2是一个用于解析XML文档的开源软件库,它支持XML1.0、XML的命名空间、XML Schema以及XSLT等。在Libxml2中,sax1是一种基于事件的XML解析器,它可以逐个读取XML文档中的每个元素,并在解析时触发事件,从而达到解析XML文档的目的。 要编译sax1,请按照以下步骤操作: 1.在终端中打开libxml2的源代码地址。 2.使用命令./configure --with-sax1来启用sax1编译选项。这个命令将在编译时添加--with-sax1选项,以便将sax1解析器链接到libxml2库中。 3.执行make命令以编译libxml2。 4.执行make install命令以安装libxml2。 5.在你的应用程序中包含libxml2头文件,并连接到libxml2库,以便使用sax1解析器来解析你的XML文档。 需要注意的是,在使用sax1解析器时,你需要创建一个回调函数来处理解析事件。具体实现可以参考libxml2官方文档中的相关示例。同时,建议使用glib库来管理内存和错误处理,以避免内存泄漏和运行时错误。 ### 回答2: libxml2是一个XML C解析库,其中包含了各种所需的工具和函数。SAX(Simple API for XML)是一种解析XML的方法,基于解析器和事件驱动模型,适用于大型XML文档。对于某些应用程序来说,使用SAX可以比DOM(Document Object Model)更高效地解析XML文档。 要编译libxml2的SAX1模块,需要遵循以下步骤: 1. 确认安装了libxml2库及其开发文件(libxml2-dev或xml2-dev)。可以在终端中使用以下命令进行检查: ``` dpkg -s libxml2-dev ``` 2. 下载libxml2源代码,可以在http://xmlsoft.org/sources/ 找到最新的版本。 3. 解压缩源代码,进入源代码文件夹,使用以下命令进行编译: ``` ./configure --with-sax1 && make ``` --with-sax1选项告诉编译器要编译SAX1模块。make命令会编译源代码并生成库文件。 4. 如果编译成功,可以在源代码文件夹下的.slibs或.libs文件夹中找到生成的库文件。 5. 编写程序时需要引用libxml/parser.h头文件,并链接编译生成的库文件。使用SAX解析XML文件时需要注册解析器回调函数,并在解析时触发这些回调函数。 总的来说,编译libxml2的SAX1模块需要先确认安装了相关开发文件,然后通过配置选项告诉编译器要编译SAX1模块,最后生成库文件并在程序中引用。 ### 回答3: libxml2是一款开源的XML解析器,支持SAX和DOM两种解析方式。其中SAX解析方式是基于事件驱动的,需要用户自定义解析处理函数来响应不同的XML事件,适合解析大型XML文件和流式数据。 要编译libxml2的sax1模块,需要安装libxml2的开发包和sax1的头文件。在Linux系统中,可使用以下命令安装: sudo apt-get install libxml2-dev 安装后,进入libxml2源代码目录,运行以下命令: ./configure --with-sax1 make make install 其中,--with-sax1参数用于启用sax1模块,make命令用于编译,make install命令用于安装。 在编译过程中,可能会遇到一些依赖项缺失的错误,需要根据提示安装相应的依赖包。编译成功后,就可以在代码中使用sax1模块来解析XML数据了。 总之,编译libxml2的sax1模块需要安装开发包、头文件和依赖项,并使用特定的命令启用和编译sax1模块。对于熟悉Linux操作的开发者来说,这个过程并不复杂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zok93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值