• XML解析方案


    在iOS中,解析XML的手段有很多

    苹果原生

    NSXMLParser:SAX方式解析,使用简单

    第三方框架

    libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析

    GDataXML:DOM方式解析,由Google开发,基于libxml2

    XML解析方式的选择建议

    大文件:NSXMLParser,libxml2

    小文件:GDataXML,NSXMLParser,libxml2

    1.使用NSXMLParser进行解析

            //创建XML解析器
            NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
            
            //设置代理
            parser.delegate = self;
            
            //开始解析XML(阻塞式的)
            [parser parse];
    

     需要实现NSXMLParserDelegate代理

    开始解析XML文档

    - (void)parserDidStartDocument:(NSXMLParser *)parser;

    XML文档解析完毕

    - (void)parserDidEndDocument:(NSXMLParser *)parser;

    解析到某个元素的开头

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict;

    解析到某个元素的结尾

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName;

    我们一般在第三个代理方法(解析到某个元素的开头)进行数据的处理

       if ([elementName isEqualToString:@"root"]) {
            return;//不解析根元素
        }
        //利用MJExtension框架将属性字典转换成模型
        DDZVideo *video = [DDZVideo mj_objectWithKeyValues:attributeDict];
        [self.videos addObject:video];
    

    2.使用GDataXML进行解析

    因为GDataXML不能使用cocoaPods进行加载,

    所以我们需要将GDataXML这个文件夹导入到项目中。

    导入之后需要进行一些设置,否则将报错

    // libxml includes require that the target Header Search Paths contain
    //
    //   /usr/include/libxml2
    //
    // and Other Linker Flags contain
    //
    //   -lxml2
    

     1.在Build Settings中

    往Header Search Paths添加

    /usr/include/libxml2

     2.在Build Settings中

    往Other Linker Flags添加

    -lxml2

     3.将项目设置成ARC与MRC混编

     






            //加载整个文档
            GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
            
            //获得所有video元素
            NSArray *elements = [doc.rootElement elementsForName:@"video"];
            for (GDataXMLElement *ele in elements) {
                DDZVideo *video = [[DDZVideo alloc] init];
                //将里面的属性分别提取
                video.name = [ele attributeForName:@"name"].stringValue;
                video.url = [ele attributeForName:@"url"].stringValue;
                video.image = [ele attributeForName:@"image"].stringValue;
                video.length = [ele attributeForName:@"length"].stringValue.intValue;
                [self.videos addObject:video];
                NSLog(@"%@",video.name);
            }
    
  • 相关阅读:
    autoresizing代码实现
    控制器的view的加载优先级
    iOS控制器的创建方式
    关于深复制和浅复制
    关于textField
    h5页面列表滚动加载数据
    数据库中存储过程和函数的区别
    Docker搭建Portainer可视化界面
    Docker部署springboot,从简单Eureka开始
    docker安装rabbitmq
  • 原文地址:https://www.cnblogs.com/langji/p/5355386.html
Copyright © 2020-2023  润新知