您的位置:首页 > 移动开发 > IOS开发

<ios>封装开源库GDataXML创建XML文件

2014-03-21 16:25 344 查看
编写目的:因最近做一个项目网络通信用到XML协议通信,而网上找的大部分资料都是XML解析。

一.开源库GDataXML下载和工程配置,请看/article/1389145.html博客, 非常感谢这位博主的分享。

特别说明:因为博主工程使用到ARC,而GDataXML是手动释放, 解决办法:

target里的build phases中,找到compile sources,把涉及到非ARC的类,后面加上: -fno-objc-arc

二.创建XML流程:

<?xml version="1.0" encoding="UTF-8" ?>
<message type="UserLogin">
<username>Hello</username>
<password>123456</password>
<vrsion>33554698</version>
</message>

1.先创建根成员

2.根成员添加子成员[GDataXMLElement addChild];

3.如果子成员还有子节点,继续2步骤

4.创建文档[GDataXMLDocument initWithRootElement];

备注:该顺序限制了插入功能,后续在进行研究

三.代码部分

JXJParseXml.h文件

#import <Foundation/Foundation.h>

#define XMLMESSAGE  (@"message")
#define MSGTYPE     (@"type")
#define XMLRET		(@"resultCode")
#define XMLVERSION  (@"1.0")
#define XMLENCODING (@"UTF-8")

/*xml 成员类*/
@interface JXJXmlElement : NSObject

/*初始化成员XMLMESSAGE*/
- (id)initWithName:(NSString *)name;

/*初始化成员XMLMESSAGE*/
- (id)initWithName:(NSString *)name stringValue:(NSString *)value;

/*设置成员值*/
- (void)setStringValue:(NSString *)str;

/* 设置成员属性*/
- (void)setAttribute:(NSString *)name stringValue:(NSString *)value;

/*添加子成员*/
- (void)addChild:(JXJXmlElement *)ele;

/*删除子成员*/
- (void)removeChild:(JXJXmlElement *)ele;

@end

/*xml文档类*/
@interface JXJXmlDocument : NSObject

/*加载xml文档*/
- (id)initWithData:(NSData *)data;

/*
初始化文档
ele:根成员
*/
- (id)initWithEle:(JXJXmlElement *)ele;

/*获取消息XMLMESSAGE值*/
- (NSString *)getMsgValue;

/*@描述*/
- (NSString *)description;

/*设置版本XMLVERSION*/
- (void)setVersion:(NSString *)version;

/*设置编码类型XMLENCODING*/
- (void)setEncoding:(NSString *)encoding;

@end

/*
调用顺序(顺序不可乱)
1.jxjCreateRootEle创建根成员(JXJXmlElement)
2.jxjAppendChildEle添加子成员(JXJXmlElement)
.....
3.最后调用jxjCreateDocument创建xml(JXJXmlDocument)
*/

@interface JXJParseXml : NSObject
/*
type:消息message值
返回JXJXmlElement
*/
+ (id)jxjCreateRootEle:(NSString *)type;
/*返回JXJXmlElement*/
+ (id)jxjAppendChildEle:(JXJXmlElement *)parentEle withName:(NSString *)name withValue:(NSString *)value;
/*返回JXJXmlDocument*/
+ (id)jxjCreateDocument:(JXJXmlElement *)xmlRootEle;

@end


JXJParseXml.m文件

#import "JXJParseXml.h"
#import "GDataXMLNode.h"

///////
@interface JXJXmlElement ()

@property (retain, nonatomic) GDataXMLElement *xmlEle;

@end

@implementation JXJXmlElement
- (id)initWithName:(NSString *)name
{
self = [super init];
if (self) {
NSError *err;
// self.xmlEle = [[GDataXMLElement alloc] initWithXMLString:name error:&err];
self.xmlEle = [GDataXMLNode elementWithName:name];
if (self.xmlEle == nil) {
NSLog(@"GDataXMLElement alloc err[%ld]", (long)[err code]);
}
}

return self;
}

- (id)initWithName:(NSString *)name stringValue:(NSString *)value
{
self = [super init];
if (self) {
NSError *err;
self.xmlEle = [GDataXMLNode elementWithName:name stringValue:value];
if (self.xmlEle == nil) {
NSLog(@"GDataXMLElement alloc err[%ld]", (long)[err code]);
}
}

return self;
}

- (void)setStringValue:(NSString *)str
{
[self.xmlEle setStringValue:str];
}

- (void)setAttribute:(NSString *)name stringValue:(NSString *)value
{
GDataXMLNode *xmlNode = [GDataXMLNode attributeWithName:name stringValue:value];
[self.xmlEle addAttribute:xmlNode];
}

- (void)addChild:(JXJXmlElement *)ele
{
[self.xmlEle addChild:ele.xmlEle];
}

- (void)removeChild:(JXJXmlElement *)ele
{
[self.xmlEle removeChild:ele.xmlEle];
}

@end

///////
@interface JXJXmlDocument ()

@property (retain, nonatomic) GDataXMLDocument *xmlDoc;

@end

@implementation JXJXmlDocument
- (id)initWithData:(NSData *)data
{
self = [super init];
if (self) {
NSError *err;
self.xmlDoc = [[GDataXMLDocument alloc] initWithData:data options:0 error:&err];
if (self.xmlDoc == nil) {
NSLog(@"initWithData error[%ld]", (long)[err code]);
}
}

return self;
}

- (id)initWithEle:(JXJXmlElement *)ele
{
self = [super init];
if (self) {
self.xmlDoc = [[GDataXMLDocument alloc] initWithRootElement:ele.xmlEle];
}

return self;
}

- (NSString *)getMsgValue
{
GDataXMLElement *rootEle = [self.xmlDoc rootElement];
if (rootEle) {
NSArray *arrEles = [rootEle elementsForName:XMLMESSAGE];
if ([arrEles count] > 0) {
GDataXMLElement *typeEle = [arrEles objectAtIndex:0];
NSString *name = [typeEle stringValue];
return name;
}
}

return nil;
}

- (NSString *)description
{
NSData *data = [self.xmlDoc XMLData];
NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

return str;
}

- (void)setVersion:(NSString *)version
{
[self.xmlDoc setVersion:version];
}

- (void)setEncoding:(NSString *)encoding
{
[self.xmlDoc setCharacterEncoding:encoding];
}

@end

///////
@implementation JXJParseXml

+ (id)jxjCreateRootEle:(NSString *)type
{
JXJXmlElement *xmlEle = [[JXJXmlElement alloc] initWithName:XMLMESSAGE];
[xmlEle setAttribute:MSGTYPE stringValue:type];

return xmlEle;
}

+ (id)jxjAppendChildEle:(JXJXmlElement *)parentEle withName:(NSString *)name withValue:(NSString *)value
{
JXJXmlElement *xmlEle = [[JXJXmlElement alloc] initWithName:name stringValue:value];
[parentEle addChild:xmlEle];

return xmlEle;
}

+ (id)jxjCreateDocument:(JXJXmlElement *)xmlRootEle
{
JXJXmlDocument *xmlDoc = [[JXJXmlDocument alloc] initWithEle:xmlRootEle];
[xmlDoc setVersion:XMLVERSION];
[xmlDoc setEncoding:XMLENCODING];

return xmlDoc;
}

@end


测试程序

@property (weak, nonatomic) IBOutlet UITextView *textView;

- (IBAction)xmlTapped:(id)sender {
/*第一种*/
JXJXmlElement *xmlMsg = [JXJParseXml jxjCreateRootEle:@"UserLogin"];
[JXJParseXml jxjAppendChildEle:xmlMsg withName:@"username" withValue:@"Hello"];
[JXJParseXml jxjAppendChildEle:xmlMsg withName:@"password" withValue:@"123456"];
[JXJParseXml jxjAppendChildEle:xmlMsg withName:@"vrsion" withValue:@"33554698"];
JXJXmlDocument *xmlDoc = [JXJParseXml jxjCreateDocument:xmlMsg];

NSString *strXml = [NSString stringWithFormat:@"%@", xmlDoc];
self.textView.text = strXml;

/*第二种*/
//    JXJXmlElement *xmlMsg = [[JXJXmlElement alloc] initWithName:XMLMESSAGE];
//    [xmlMsg setAttribute:MSGTYPE stringValue:@"UserLogin"];
//    [JXJParseXml jxjAppendChildEle:xmlMsg withName:@"username" withValue:@"Hello"];
//    [JXJParseXml jxjAppendChildEle:xmlMsg withName:@"password" withValue:@"123456"];
//    [JXJParseXml jxjAppendChildEle:xmlMsg withName:@"vrsion" withValue:@"33554698"];
//    JXJXmlDocument *xmlDoc = [[JXJXmlDocument alloc] initWithEle:xmlMsg];
//    [xmlDoc setVersion:XMLVERSION];
//    [xmlDoc setEncoding:XMLENCODING];
//    NSString *strXml = [NSString stringWithFormat:@"%@", xmlDoc];
//    self.textView.text = strXml;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐