使用GDataXML 自适应软解析XML格式(不用管xml具体值)
来源:互联网 发布:程序员中级职称考试 编辑:程序博客网 时间:2024/06/04 22:47
之前项目中用ios自带的XMLParser,实现了自适应解析(即 不管xml文档具体的值,解析成字典),但是因为本身XMLParser是异步的,可能有时候需要用同步时不方便。
正好 这两天用到 GDataXML, 发现如果对应对应的xml文件 做硬解析,可能之后文档发生变化又得重新编码了。于是编写了能自适应大部分的xml文档的 解析方法。当然具体解析需要什么类型看自己实际使用情况了。这里 是解析成字典的。
例如:
例 1:
<?xml version="1.0"encoding="utf-8"?>
<CMD_RES code=14 index=14 res = 0>
</CMD_RES>
解析为:
"CMD_RES" =
{
code = 14;
index = 14;
res = 0;
};
例2
<?xml version="1.0" encoding="utf-8"?>
<CMD_RES code="7" index="7" res = "0">
<AP index = "1" ssid = "aaaa" />
<AP index = "2" ssid = "bbbb" />
</CMD_RES>";
解析为:
"CMD_RES" = {
code = 7;
index = 7;
res = 0;
};
AP = (
{
index = 1;
ssid = "aaaa";
},
{
index = 2;
ssid = "bbbb";
},
);
代码本身不是很复杂,不过很方便,除了将根节点的,属性单独提出来,其他的属性都会和值一起包含在一起,试用的格式还是蛮多的,当然没有匹配所有的,因为才写好,有遗漏的可再修改部分细节。接下来把方法贴上,仅供参考,如果有更好的方法期待分享: )
@class GDataXMLDocument;
@interface XMLFileParser : NSObject
{
GDataXMLDocument *_xmlDoc;
}
- (NSDictionary *)getSyncXMLParserWithStr:(NSString *)xmlStr;
- (NSDictionary *)getSyncXMLParserWithData:(NSData *)xmlData;
@end#import "GDataXMLNode.h"
@implementation XMLFileParser
#pragma mark -
#pragma mark Synchronous
- (NSDictionary *)getSyncXMLParserWithStr:(NSString *)xmlStr
{
if (nil == xmlStr)
{
return nil;
}
[_xmlDoc release];
_xmlDoc = [[GDataXMLDocumentalloc]initWithXMLString:xmlStroptions:0error:nil];
GDataXMLElement *rootElement = [_xmlDocrootElement];
return [selfxmlParser:rootElementifRootNode:YES];
}
- (NSDictionary *)getSyncXMLParserWithData:(NSData *)xmlData
{
if (nil == xmlData)
{
return nil;
}
[_xmlDoc release];
_xmlDoc = [[GDataXMLDocumentalloc]initWithData:xmlDataoptions:0error:nil];
GDataXMLElement *rootElement = [_xmlDocrootElement];
return [selfxmlParser:rootElementifRootNode:YES];
}
- (NSDictionary *)xmlParser:(GDataXMLElement *)element ifRootNode:(BOOL)isRoot
{
if (nil == element)
{
return nil;
}
NSMutableDictionary *dict = [NSMutableDictionarydictionary];
NSArray *attributes = [elementattributes];
NSMutableDictionary *headDict = [NSMutableDictionarydictionary];
for (GDataXMLElement *tempNodein attributes)
{
NSString *str = [tempNodename];
[headDict setObject:[tempNodestringValue]forKey:str];
}
if (isRoot)
{
//根节点的属性单独提出 类似例子中的 cmd_res
[dict setObject:headDictforKey:[elementname]];
}
else
{
[dict addEntriesFromDictionary:headDict];
}
for (GDataXMLElement *nodein [elementchildren])
{
NSString *nodeName = [nodename];
id nodeValue = [nodestringValue];
if ([nodeisKindOfClass:[GDataXMLElementclass]] && [[nodeattributes]count] >0)
{
nodeValue = [selfxmlParser:nodeifRootNode:NO];
}
else if ([node childCount] >1)
{
nodeValue = [selfxmlParser:nodeifRootNode:NO];
}
if ([dictobjectForKey:nodeName])
{
id sub = [dictobjectForKey:nodeName];
NSMutableArray *tempArray = [NSMutableArrayarray];
if ([subisKindOfClass:[NSArrayclass]] || [subisKindOfClass:[NSMutableArrayclass]])
{
[tempArray addObjectsFromArray:sub];
}
else
{
[tempArray addObject:sub];
}
[tempArray addObject:nodeValue];
[dict setObject:tempArrayforKey:nodeName];
}
else
{
[dict setObject:nodeValueforKey:nodeName];
}
}
return dict;
}
- (void)dealloc
{
[_xmlDoc release];
[super dealloc];
}
@end
//初次试用GDataXML,写了自动解析的方法,暂时没考虑效率问题,代码供参考,若有优化或者更好的方法欢迎指出:)
- 使用GDataXML 自适应软解析XML格式(不用管xml具体值)
- 使用GDataXML解析XML文档
- 使用GDataXML解析XML文档
- 使用GDataXML解析XML文档
- 使用GDataXML解析XML文档
- 使用GDataXML解析XML文档
- 使用GDataXML解析XML文档
- 使用GDataXML解析XML文档
- 使用GDataXML解析XML文档
- XML解析(NSXMLParser、GDataXML)
- 利用GDataXml解析xml
- GDataXML解析XML
- GDataXML解析XML文档
- GDataXML解析XML
- IOS GDataXML 解析xml
- GDataXML-HTML 解析XML
- IOS XML解析之GDataXML
- Iphone 使用 GDataXml 解析通过HTTP获取的XML文件
- 用户心理与游戏运营和推广——作者yixian
- MYSQL 连接数据库命令收藏
- leetcode:Longest Common Prefix
- [037] 微信公众帐号开发教程第13篇-图文消息全攻略
- 1019 General Palindromic Number (20)
- 使用GDataXML 自适应软解析XML格式(不用管xml具体值)
- Oracle中的TIMESTAMP类型
- Ubuntu 12.04下PostgreSQL-9.1安装与配置详解(在线安装)
- DOS下编译带包的java文件
- NYOJ527 AC_mm玩dota
- cocos2d-x环境搭建
- 有一函数当x<0时y=1,当x>0时,y=3,当x=0时y=5,编程,从键盘输入一个x值,输出y值
- 内核调试pr_debug
- 1020 Tree Traversals (25)