在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); }