XML解析

一、简介
一个常见的XML文档一般由以下部分组成
文档声明            <?xml version="1.0" encoding="UTF-8" ?>
元素(Element)  <video>小黄人</video>
属性(Attribute)   <video name="小黄人第01部"length="30" />
 
XML的解析方式有2种
DOM:一次性将整个XML文档加载进内存,比较适合解析小文件
SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件
 
在iOS中,解析XML的手段有很多
苹果原生
NSXMLParser:SAX方式解析,使用简单
第三方框架
libxml2:纯C语言,默认包含在iOSSDK中,同时支持DOM和SAX方式解析
GDataXML:DOM方式解析,由Google开发,基于libxml2
 
XML解析方式的选择建议
大文件:NSXMLParser、libxml2
小文件:GDataXML
 
一、解析方式
1、NSXMLParser(SAX方式 大文件)
  使用步骤

       NSXMLParser *parser = [[NSXMLParseralloc] initWithData:data];             // 传入XML数据,创建解析器

       parser.delegate = self;                 // 设置代理,监听解析过程

       [parser parse];          // 开始解析,会卡住,直到解析完毕

       NSXMLParser-delegate
  当扫描到文档的开始时调用(开始解析)

       - (void)parserDidStartDocument:(NSXMLParser *)parser

  当扫描到文档的结束时调用(解析完毕)

       - (void)parserDidEndDocument:(NSXMLParser *)parser

 当扫描到元素的开始时调用(attributeDict存放着元素的属性)

       - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURIqualifiedName:(NSString  *)qName attributes:(NSDictionary *)attributeDict

  当扫描到元素的结束时调用

       - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName


2、GDataXML(DOM方式 小文件)
      GDataXML配置
  GDataXML基于libxml2库,得做以下配置
  导入libxml2库
       
  设置libxml2的头文件搜索路径(为了能找到libxml2库的所有头文件)
  在Head Search Path中加入/usr/include/libxml2
  设置链接参数(自动链接libxml2库)
  在OtherLinkerFlags中加入-lxml2
  由于GDataXML是非ARC的,因此得设置编译参数
       
 
     解析方式
     // 1.加载文档
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];
    // 2.获得根元素
    GDataXMLElement *root = doc.rootElement;    
    // 3.获得所有video元素
    NSArray *elements = [root elementsForName:@"video"];    
    // 4.将GDataXMLElement对象转成HMVideo模型
    NSMutableArray *videos = [NSMutableArray array];
    for (GDataXMLElement *ele in elements) {
        HMVideo *video = [[HMVideo alloc] init];      
        video.ID = [ele attributeForName:@"id"].stringValue.intValue;               //一个一个元素的解析
        video.length = [ele attributeForName:@"length"].stringValue.intValue;
        video.name = [ele attributeForName:@"name"].stringValue;
        video.image = [ele attributeForName:@"image"].stringValue;
        video.url = [ele attributeForName:@"url"].stringValue;
        [videos addObject:video];
    }
 
原文地址:https://www.cnblogs.com/hepingqingfeng/p/5457725.html