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示例
 
示例:
[html] view plaincopy
  1. <root>  
  2.      <name value="wusj"/>  
  3.      <age>24</age>  
  4. </root>  
 
对此xml文件进行解析
 
    
[cpp] view plaincopy
  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];

}

转载于:https://www.cnblogs.com/iOS-mt/p/4172059.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php必须汉字,php怎么只保留汉字

php只保留汉字的实现方法&#xff1a;首先创建一个PHP示例文件&#xff1b;然后通过mb_convert_encoding进行转码&#xff1b;最后通过preg_match_all实现过滤掉非汉字字符只保留中文字符即可。本文操作环境&#xff1a;windows7系统、PHP7.1版&#xff0c;DELL G3电脑PHP实现过…

LeetCode 1793. 好子数组的最大分数(单调栈)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff08;下标从 0 开始&#xff09;和一个整数 k 。 一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i1], ..., nums[j]) * (j - i 1) 。一个 好 子数组的两个端点下标需要满足 i < k < j 。 请你返回…

hbase的2.2.4版本支持哪个版本的hadoop_Hadoop 2.7 不停服升级到 3.2 在滴滴的实践

桔妹导读&#xff1a;Hadoop 3的第一个稳定版本在2017年底就已经发布了&#xff0c;有了很多重大的改进。在HDFS方面&#xff0c;支持了Erasure Coding、More than 2 NameNodes、Router-Based Federation、Intra-datanode balancer 等功能&#xff0c;大家可能对这些功能很感兴…

pcb只开窗不镀锡_案例图解射频PCB设计要点

在电子产品和设备中&#xff0c;电路板是一个不可缺少的部件&#xff0c;它起着电路系统的电气和机械等的连接作用。如何将电路中的元器件按照一定的要求&#xff0c;在PCB上排列组合起来&#xff0c;是PCB设计师的主要任务之一。布局设计不是简单的将元器件在PCB上排列起来&am…

HDFS Java API 实践

文章目录1. 启动 Hadoop 集群2. 使用 HDFS Shell3. 使用 HDFS Web UI4. 安装 Eclipse IDE4.1 上传文件4.2 查询文件位置4.3 创建目录4.4 读取文件内容4.5 写入文件1. 启动 Hadoop 集群 安装集群&#xff1a;https://michael.blog.csdn.net/article/details/114607857 启动命令…

python 一组数据 正态分布散点图_利用Python进行数据分析之多元线性回归案例

线性回归模型属于经典的统计学模型&#xff0c;该模型的应用场景是根据已知的变量&#xff08;自变量&#xff09;来预测某个连续的数值变量&#xff08;因变量&#xff09;。例如&#xff0c;餐厅根据每天的营业数据&#xff08;包括菜谱价格、就餐人数、预定人数、特价菜折扣…

php7 关联nginx,nginx+php7配合开发

1 源码安装php7下载php7./configure --eable fpm --prefix路径(指定路径&#xff0c;所有的文件会安装在这里。不然会文件会分散到别的地方)make & make install完成php的安装(如果想要按照php扩展可以用pecl命令或者phpize命令来按照)2 安装nginxyum install nginx开启ng…

python 量化交易_基于Python的量化交易工具清单(上)

—— Python量化工具清单 ——以下内容来源于Wilson Freitas的Github项目"Awesome Quant"。原文中包含了丰富的语言类别&#xff0c;但是后续介绍主要针对Python语言。原网址&#xff1a;https://github.com/ wilsonfreitas/awesome-quant基于Python的量化交易工具清…

jlist放jbutton 按钮事件失效_电动高处作业吊篮操作如何面对一些突发事件

电动吊篮从推广发展初期的不认识&#xff0c;不理解&#xff0c;不使用到今天在大中城市的建筑业中成了一种不可缺少的必备机具&#xff0c;在建筑工程施工技术工艺水平上和以往的脚手架相比&#xff0c;更是有一个空前的飞跃。正是由于电动吊篮加高方便、操作简单、安全可靠、…

LintCode MySQL 1968. 查询首两个字母在 ‘Db‘ 和 ‘Dy‘ 之间的课程名称(REGEXP正则)

文章目录1. 题目2. 解题1. 题目 描述 请编写 SQL 语句&#xff0c;查询 courses 表中&#xff0c;课程名首两个字母在 ‘Db’ 和 ‘Dy’ 之间所有课程的名称 https://www.lintcode.com/problem/1968 2. 解题 -- Write your SQL Query here -- -- example: SELECT * FROM XX_…

erp系统方案书_门禁系统方案书

门禁系统概述传统意义的门禁系统是由琐和钥匙构成&#xff0c;以钥匙代表着出入权限。但社会发展至今&#xff0c;以铁锁和钥匙为代表的传统房门管理方式正在逐渐消失&#xff0c;加上IC卡技术、数字技术、网络技术的应用日益成熟&#xff0c;管理安全、可靠、灵活、和方便的IC…

mybatisplus 操作另一个数据库的数据_MySQL的数据库操作详解

一、mysql查看数据库在 MySQL 中&#xff0c;可使用 SHOW DATABASES 语句来查看或显示当前用户权限范围以内的数据库。查看数据库的语法格式为&#xff1a;SHOW DATABASES [LIKE 数据库名];//例子SHOW DATABASES;SHOW DATABASES like mynews;show databases like %name%;语法说…

LeetCode 385. 迷你语法分析器(栈)

文章目录1. 题目2. 解题1. 题目 给定一个用字符串表示的整数的嵌套列表&#xff0c;实现一个解析它的语法分析器。 列表中的每个元素只可能是整数或整数嵌套列表 提示&#xff1a;你可以假定这些字符串都是格式良好的&#xff1a; 字符串非空 字符串不包含空格 字符串只包含…

php unicode 插入 mysql_关于MySQL的一些骚操作——提升正确性,抠点性能

推荐阅读&#xff1a;我凭借这份pdf拿下了蚂蚁金服、字节跳动、小米等大厂的offer概要回顾以前写的项目&#xff0c;发现在规范的时候&#xff0c;还是可以做点骚操作的。假使以后还有新的项目用到了MySQL&#xff0c;那么肯定是要实践一番的。为了准备&#xff0c;创建测试数据…

docker $PWD路径_Docker 技术系列之安装Redis单机版和集群版

欢迎关注刘哥讲技术。上一节我们讲到通过docker安装了多台的mysql&#xff0c;很简单&#xff0c;那么我们这一节&#xff0c;利用 Docker 在一台机器上部署多个 Redis 实例。那么redis是什么呢&#xff1f;Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持…

LeetCode 1191. K 次串联后最大子数组之和(前缀和+分类讨论)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 arr 和一个整数 k。 首先&#xff0c;我们要对该数组进行修改&#xff0c;即把原数组 arr 重复 k 次。 举个例子&#xff0c;如果 arr [1, 2] 且 k 3&#xff0c;那么修改后的数组就是 [1, 2, 1, 2, 1, 2]。 然后&#x…

sql 拆分_实践参考:MySQL架构设计从开发规范、选型、拆分到减压实战指南

导引作者&#xff0c;李辉&#xff0c;原新浪爱彩票运维负责人&#xff0c;常用网名&#xff1a;门牙没了。曾主导新浪爱彩票的MySQL运维工作。培训合伙人、资深讲师&#xff0c;中国科学院大学在读研究生(大数据方向)&#xff0c;擅长大型项目的关系型数据库运维和管理&#x…

PowerBuilder调用.Net编译好的DLL

[ComVisible(true)][ClassInterface(ClassInterfaceType.AutoDual)][ProgId("HelloWorld.MyClass")] //类名public class MyClass{public string UserName { get; set; } //对外提供属性public string SayHello(string content) //对外提供方法{return "用户:&q…

python中流程图_python用graphviz画流程图

问题描述 项目中需要用到流程图&#xff0c;如果用js的echarts处理&#xff0c;不同层级建动态计算位置比较复杂&#xff0c;考虑用python来实现 测试demo实现效果如下完整代码 import yaml import os import ibm_db from graphviz import Digraph from datetime import dateti…

天池 在线编程 牛郎织女(广度优先搜索)

文章目录1. 题目2. 解题1. 题目 描述 又到了七夕节&#xff0c;牛郎织女相约一起去一个n*m大小的迷宫maze里玩耍。 然而没过多久&#xff0c;他们就倒霉地走散了。 现在给定由.,*,S,T组成的矩阵maze&#xff0c; 其中.表示空地,*表示障碍物,S表示牛郎的位置 ,T表示织女的位置&…