ios中GDataXML解析XML文档
参考文章 http://blog.csdn.net/ryantang03/article/details/7868246
适合解析一个节点多个属性要用GDataXml 格式如下
<?xml version="1.0" encoding="UTF-8"?>
<result spend_time="16ms">>
<data>
<item wait_count="4"max_wait_time="10"branch_id="0">
<item wait_count="0"max_wait_time="7" branch_id="232051000" />
<item wait_count="0"max_wait_time="4" branch_id="232051001" />
</item>
</data>
</result>
NSString *path=[[NSBundle mainBundle] pathForResource:@"" ofType:@"xml"];
NSData *data=[[NSData alloc] initWithContentsOfFile:path];
GDataXMLDocument *doc=[[GDataXMLDocument alloc] initWithData:data options: error:nil];
//获取根节点
GDataXMLElement *rootElement=doc.rootElement; NSArray *arr=[rootElement nodesForXPath:@"//item/item" error:nil];
for (GDataXMLElement *ele in arr) {
NSLog(@"-->%@--->%@",[[ele attributeForName:@"wait_count"]stringValue],[[ele attributeForName:@"branch_name"]stringValue]);
}
一个节点一个属性,推荐使用下面方法
<?xml version="1.0" encoding="utf-8"?>
<Users>
<User id="001">
<name>Ryan</name>
<age>24</age>
</User>
<User id="002">
<name>Tang</name>
<age>23</age>
</User>
</Users>
封装方法
#import <Foundation/Foundation.h> @protocol UseXmlParser <NSObject> @optional
- (void)NetWorkBackConnectID:(int)connectID BackDic:(NSMutableDictionary*)aBackDic WithNetState:(int)netState; @end @interface UseXmlParser : NSObject<NSXMLParserDelegate>
{
id aTarget;
int aConnectId; NSMutableData *parData; NSXMLParser *xmlParser; NSMutableArray *dicNameArray;
BOOL endStringElement;
NSMutableString *keyString;
NSMutableDictionary *xmlDataSource;
}
-(id)initWithParserData:(NSData*)pData target:(id)toTarget connectId:(int)bConnectId; -(void)parser; @end ==========
#import "UseXmlParser.h" @implementation UseXmlParser -(id)initWithParserData:(NSData*)pData target:(id)toTarget connectId:(int)bConnectId{
if (self = [super init]) { aTarget = toTarget;
aConnectId = bConnectId; dicNameArray = [[NSMutableArray alloc] initWithCapacity:];
keyString = [[NSMutableString alloc] initWithCapacity:];
xmlDataSource=[[NSMutableDictionary alloc] initWithCapacity:];
endStringElement = FALSE; parData = [[NSMutableData alloc] initWithData:pData]; }
return self;
}
-(void)parser{
xmlParser = [[NSXMLParser alloc] initWithData:parData];
[xmlParser setDelegate:self];
[xmlParser parse];//开始解析
[xmlParser release];
} -(NSMutableDictionary*) getDic {
NSMutableDictionary *dic=xmlDataSource;
for (int i=; i<[dicNameArray count]; i++) {
dic=[dic objectForKey:(NSString*)[dicNameArray objectAtIndex:i]];
}
return dic;
}
- (NSString*)getListElement:(NSString*)elementName From:(NSArray*)array {
NSString *temp = elementName;
for (int i=; i<; i++) {
if ([array containsObject:elementName]) {
elementName = [NSString stringWithFormat:@"%@%d", temp, i+];
}
else {
return elementName;
}
}
return nil;
}
- (id)getStringByKey:(NSString*)key {
NSArray *array = [key componentsSeparatedByString:@"/"];
NSDictionary *dic = [NSDictionary dictionary];
for (int i=; i<[array count]-; i++) {
dic = [dic objectForKey:[array objectAtIndex:i]];
}
NSString *temp = [dic objectForKey:[array objectAtIndex:[array count]-]];
if (!temp) {
temp = @"";
}
return temp;
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if ([dicNameArray count]>) {
NSMutableDictionary *dic = [self getDic];
elementName = [self getListElement:elementName From:[dic allKeys]]; [dic setObject:[[NSMutableDictionary alloc] init] forKey:elementName];
[dicNameArray addObject:elementName];
}
else {
[xmlDataSource setObject:[[NSMutableDictionary alloc] init] forKey:elementName];
[dicNameArray addObject:elementName];
} endStringElement = TRUE;
[keyString setString:@""];
} -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
[keyString appendString:string];
}
- (NSMutableDictionary*)getLastDic {
NSMutableDictionary *dic=xmlDataSource;
for (int i=; i<[dicNameArray count]-; i++) {
dic=[dic objectForKey:(NSString*)[dicNameArray objectAtIndex:i]];
}
return dic;
}
-(void) removeLastDic {
if ([dicNameArray count]>) {
[dicNameArray removeLastObject];
}
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if (endStringElement) {
if (![keyString isEqualToString:@"\n"]) {
if ([keyString hasPrefix:@"\n"]) {
[keyString setString:[keyString substringFromIndex:]];
}
NSMutableDictionary *dic = [self getLastDic];
[dic setObject:[NSString stringWithString:keyString] forKey:[dicNameArray objectAtIndex:[dicNameArray count]-]];
}
} [keyString setString:@""];
endStringElement = FALSE;
[self removeLastDic]; }
- (void)parserDidEndDocument:(NSXMLParser *)parser {
NSLog(@" \nxml解析返回-->> %@",xmlDataSource);
if (aTarget && [aTarget respondsToSelector:@selector(NetWorkBackConnectID:BackDic:WithNetState:)]) {
[aTarget NetWorkBackConnectID:aConnectId BackDic:xmlDataSource WithNetState:];
}
} -(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"--error-->%@",parseError.localizedDescription);
}
-(void)dealloc{ [dicNameArray release];
[keyString release];
[xmlDataSource release];
[super dealloc];
}
@end
使用方式
- (IBAction)click:(id)sender { UseXmlParser *parser1=[[UseXmlParser alloc] initWithParserData:data target:self connectId:];
[parser1 parser];
[parser1 release];
} - (void)NetWorkBackConnectID:(int)connectID BackDic:(NSMutableDictionary*)aBackDic WithNetState:(int)netState{
NSLog(@"--%@",aBackDic);
}
ios中GDataXML解析XML文档的更多相关文章
- Objective-C ,ios,iphone开发基础:使用GDataXML解析XML文档,(libxml/tree.h not found 错误解决方案)
使用GDataXML解析XML文档 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是大多情况下都倾向于用第三方的库,原因是解析效率更高.使用上更方便 这里主要介绍一下 ...
- 使用GDataXML解析XML文档
转载自:http://blog.csdn.net/tangren03/article/details/7868246 在IOS平台上进行XML文档的解析有很多种方法,在SDK里面有自带的解析方法,但是 ...
- Java中Dom解析xml文档
xml文档 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id ...
- IOS学习笔记27—使用GDataXML解析XML文档
http://blog.csdn.net/ryantang03/article/details/7868246
- Xml学习笔记(3)利用递归解析Xml文档添加到TreeView中
利用递归解析Xml文档添加到TreeView中 private void Form1_Load(object sender, EventArgs e) { XmlDocument doc = new ...
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- 使用dom4j解析XML文档
dom4j的包开源包,不属于JDK里面,在myeclipse中要单独导入在项目中,这里不累赘了 做这个过程,很慢,因为很多方法没用过不熟悉,自己得去查帮助文档,而且还得去试,因为没有中文版,英文翻译不 ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- java解析xml文档(dom)
DOM解析XML文档 读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵. DOM解析的特性就是读取xml文件 ...
随机推荐
- SharePoint 列表权限控制
一提到sharepoint 我相信权限控制一定会是一个很重要的话题,尤其是对列表的权限控制,创建.修改.查看权限.其实网上这方面的资料已经很多了,尤其是以下2篇文章,后来索性把CodeArt_Perm ...
- [BUG] Dashboard报错:if usages['subnets']['available'] <= 0: KeyError: 'available'
Openstack版本号:Liberty 系统平台:CentOS 7.2 64bit ######################################################### ...
- redis调优 -- 内存碎片
最近查看了一下redis运行状况,发现公司测试服务器的redis内存不太够用,但是实际占用内存的数据量其实不大,以前也没有这种情况,之前在cache层新增了一个防刷积分任务的逻辑才会这样,搜索一下原因 ...
- 双数组Trie树(DoubleArrayTrie)Java实现
http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE ...
- 2017 年度码云新增项目排行榜 TOP 50,为它们打“call”
2017 年度码云新增项目排行榜 TOP 50 正式出炉 !2017 结束了,我们来关注一下这一年里码云上新增的最热门的开源项目吧.此榜单根据 2017 年在码云上新增开源项目的 Watch.Star ...
- Linux下C结构体初始化[总结]
1.前言 今天在公司看一同事写的代码,代码中用到了struct,初始化一个struct用的是乱序格式,如下代码所示: typedef struct _data_t { int a; int b; }d ...
- 转: MinGw离线安装方法集合
转自: http://www.cnblogs.com/smartdog/archive/2012/03/30/2425124.html https://www.zhihu.com/question/2 ...
- docker service ps打印出来的错误信息被截断了怎么办?
[解决方法] 用Format属性: 这个其实解决不了截断的问题,不过可以显示更少的列,看起来更清楚. Formatting The formatting options (--format) pr ...
- 解决jetty runner锁定js
在web.xml中添加 <servlet> <!-- Override init parameter to avoid nasty --> <!-- file locki ...
- ExtJS学习笔记2:响应事件、使用AJAX载入数据
响应事件: 1.设置一个html标记 <div id="my-div">Ext JS 4 Cookbook</div> 2.使用get函数获取此标记对象 v ...