zoukankan      html  css  js  c++  java
  • IOS学习:常用第三方库(GDataXMLNode:xml解析库)

     

    IOS学习:常用第三方库(GDataXMLNode:xml解析库)

     

    解析 XML 通常有两种方式,DOM 和 SAX:

    DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。

    SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。

    一般在iOS平台下,比较常用的XML解析类库有如下几种:

    NSXMLParser,http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html ,这是一个SAX方式解析XML的类库,默认包含在iOS SDK中,使用也比较简单。

    libxml2,http://xmlsoft.org/,是一套默认包含在iOS SDK中的开源类库,它是基于C语言的API,所以使用起来可能不如NSXML方便。这套类库同时支持DOM和SAX解析,libxml2的SAX解析方式还是非常酷的,因为它可以边读取边解析,尤其是在从网上下载一个很大的XML文件,就可以一边下载一边对已经下载好的内容进行解析,极大的提高解析效率。

    TBXML,http://www.tbxml.co.uk/TBXML/TBXML_Free.html,这是一套轻量级的DOM方式的XML解析类库,有很好的性能和低内存占用,不过它不对XML格式进行校验,不支持XPath,并且只支持解析,不支持对XML进行修改。

    TouchXML,https://github.com/TouchCode/TouchXML,这也是一套DOM方式的XML解析类库,支持XPath,不支持XML的修改。

    KissXML,http://code.google.com/p/kissxml/,这是一套基于TouchXML的XML解析类库,和TouchXML相比,支持了XML的修改。

    TinyXML,http://www.grinninglizard.com/tinyxml/,这是一套小巧的基于C语言的DOM方式进行XML解析的类库,支持对XML的读取和修改,不直接支持XPath,需要借助另一个相关的类库TinyXPath才可以支持XPath。

    GDataXML,http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/,这是一套Google开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询。

     
    一、GDataXMLNode说明
     
    GDataXMLNode是Google提供的用于XML数据处理的类集。该类集对libxml2--DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且支持XPath语法。
     
    使用方法:
         1、获取GDataXMLNode.h/m文件,将GDataXMLNode.h/m文件添加到工程中
         2、向工程中增加“libxml2.dylib”库
         3、在工程的“Build Settings”页中找到“Header Search Path”项,添加/usr/include/libxml2"到路径中
         4、添加“GDataXMLNode.h”文件到头文件中,如工程能编译通过,则说明GDataXMLNode添加成功
     
    二、GDataXMLNode示例
     
    示例:
    1. <root>  
    2.      <name value="wusj"/>  
    3.      <age>24</age>  
    4. </root>  
     
    对此xml文件进行解析
     
        
    1. NSString *xmlPath = [[NSBundlemainBundle] pathForResource:@"test"ofType:@"xml"];  
    2.     NSString *xmlString = [NSStringstringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncodingerror:nil];  
    3.     GDataXMLDocument *xmlDoc = [[GDataXMLDocument  alloc]  initWithXMLString:xmlString  options:0  error:nil];  
    4.     GDataXMLElement *xmlEle = [xmlDoc rootElement];  
    5.     NSArray *array = [xmlEle children];  
    6.     NSLog(@"count : %d", [array count]);  
    7.      
    8.     for (int i = 0; i < [array count]; i++) {  
    9.         GDataXMLElement *ele = [array objectAtIndex:i];  
    10.           
    11.         // 根据标签名判断  
    12.         if ([[ele name] isEqualToString:@"name"]) {  
    13.             // 读标签里面的属性  
    14.             NSLog(@"name --> %@", [[ele attributeForName:@"value"] stringValue]);  
    15.         } else {  
    16.             // 直接读标签间的String  
    17.             NSLog(@"age --> %@", [ele stringValue]);  
    18.         }  
    19.          
    20.     }  

     
        运行结果:
            
        
     
    三、GDataXMLNode方法小结
     
         最终的数据读出都是在GDataXMLElement对象中读出的,以下方法均为GDataXMLElement类的方法
         1、name方法,取标签名 e.g name标签的名称“name”
         2、attributeForName: 取属性结点 再调stringValue即可取到属性值 e.g name标签中的value属性
         3、stringValue: 取标签间的字符串值  e.g: age间的24
     
     
     
     
     

    //DOM 解析

    - (IBAction)dommethord:(id)sender {

        //1,拿到文件

        NSString *path = [[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"];

        //2,根据路径拿到数据

        NSData *data = [NSData dataWithContentsOfFile:path];

        

        //3,创建解析对象

        GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

        //4,获取根

        GDataXMLElement *rootElement = document.rootElement;

        //初始化数组

        _allDataMutaArray = [NSMutableArray array];

        _allDataMutaString = [NSMutableString string];

        

        //5,获取根节点下的 所有子节点

        NSArray *stuArrayElement = rootElement.children;

        

        //6,遍历每一个Student

        for (GDataXMLElement *stuElement in stuArrayElement) {

            //每遍历一次就 创建一个模型

            Student *stu = [Student new];

            //7,遍历子节点

            for (GDataXMLElement *stuSubElement in stuElement.children) {

                //8,使用KVC的方式 对模型对象进行复制

                [stu setValue:stuSubElement.stringValue forKey:stuSubElement.name];

                //打印

                NSLog(@"%@ %@ ",stuSubElement.name,stuSubElement.stringValue);

                [_allDataMutaString appendString:stuSubElement.stringValue];

            }

            //将添加好的模型放入数组中

            [_allDataMutaArray addObject:stu];

            [stu release];

           

            NSLog(@"----%lu",stu.retainCount);

           

        }

        NSLog(@" 数据项  %@",_allDataMutaArray);

        

        _textFieldView.text = _allDataMutaString;

        

        [document release];

    }

  • 相关阅读:
    JavaScript数组操作
    cxf-rs 和 swagger 的点
    cxf-rs 、spring 和 swagger 环境配置切换【github 有项目】
    (二)swagger-springmvc
    (二)spring-mvc-showcase 和 swagger-springmvc 的恩恩怨怨
    svn 创建tag
    swagger 入门
    jax-rs
    swagger core 和 swagger ui 如何关联【窥探】
    配置 struts2 时掉进 web.xml 的坑
  • 原文地址:https://www.cnblogs.com/iOS-mt/p/4172059.html
Copyright © 2011-2022 走看看