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);
        }
原文地址:https://www.cnblogs.com/langji/p/5355386.html