IOS原生API解析和创建XML
2015-11-18 10:42
751 查看
一、解析XML
1.创建一个类Post
<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface Post : NSObject
@property (copy, nonatomic) NSString *title;
@property (copy, nonatomic) NSString *postDescription;
@property (copy, nonatomic) NSDate *pubDate;
@property (copy, nonatomic) NSString *contentURL;
@end</span><span style="font-size:24px;">
</span>2.解析 创建一个类TopStoriesParset
.h文件
#import <Foundation/Foundation.h>
@protocol TopStoriesDelegate <NSObject>
.m文件
#import "TopStoriesParser.h"
#import "Post.h"
@interface TopStoriesParser ()
{
Post *post;
NSMutableString *currentValue;
BOOL parsingItem;
}
@end
@implementation TopStoriesParser
- (instancetype)initWithFeedData:(NSData *)data
{
if (self = [super init]) {
self.feedData = data;
}
return self;
}
- (void)parseTopStoriesFeed
{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:_feedData];
parser.delegate = self;
[parser parse];
}
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
_posts = [[NSMutableArray alloc] init];
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
if ([_delegate respondsToSelector:@selector(topStoriesParsedWithResult:)]) {
[_delegate topStoriesParsedWithResult:_posts];
}
}
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
if ([elementName isEqualToString:@"item"]) {
post = [[Post alloc] init];
parsingItem = YES;
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSString *tmpValue = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if (currentValue == nil) {
currentValue = [[NSMutableString alloc] initWithString:tmpValue];
} else {
[currentValue appendString:tmpValue];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"item"]) {
[_posts addObject:post];
post = nil;
parsingItem = NO;
}
if (parsingItem == YES) {
if ([elementName isEqualToString:@"title"]) {
post.title = currentValue;
} else if ([elementName isEqualToString:@"description"]) {
post.postDescription = currentValue;
} else if ([elementName isEqualToString:@"pubDate"]) {
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"];
post.pubDate = [df dateFromString:currentValue];
} else if ([elementName isEqualToString:@"feedburner:origLink"]) {
post.contentURL = currentValue;
}
}
currentValue = nil;
}
@end说明:
1、当开始解析时,它会在初始化NSMutableArray(用户存储处理过的Post对象)时调用parserDidStartDocument:方法,与之类似,当解析到文档末尾时,parserDidEndDocument:方法会的到调用,这是解析完成,从而通知委托。
2、当开始处理新元素时会调用parser:didStartElement:namespaceURI:qualifiedName:attributes:方法。这是处理属性的地方:记住,属性是起始标签的一部分。当从元素中读取内容时会调用parser:foundCharacters:方法,当元素关闭时会调用parser:didEndElement:namespaceURI:qualifiedName:方法。当所有元素都关闭时就可以安全的处理和存储任何累计下来的内容了。
二、生成XML文件
libxml是IOS自带的用于生成XML的原生唯一API,它是基于C语言的API
在build phases的Link Binary With Libraries导入libxml2.2.tbd
然后在解析的文件中添加:#import <libxml/xmlwriter.h>
+ (NSData *)postXMLDataFromDictionary:(NSDictionary *)dictionary
<span style="font-size:14px;">{
xmlTextWriterPtr _writer;
xmlBufferPtr _buffer;
xmlChar *_elementName;
xmlChar *_elementValue;
_buffer = xmlBufferCreate();
_writer = xmlNewTextWriterMemory(_buffer, 0);
xmlTextWriterStartDocument(_writer, "1.0", "UTF-8", NULL);
xmlTextWriterStartElement(_writer, BAD_CAST "articles");
NSArray *posts = [dictionary objectForKey:@"articles"];
for (NSDictionary *post in posts) {
xmlTextWriterStartElement(_writer, BAD_CAST "article");
NSArray *keys = [post allKeys];
for (NSString *key in keys) {
_elementName = (xmlChar *)[key UTF8String];
_elementValue = (xmlChar *)[[post objectForKey:key] UTF8String];
xmlTextWriterStartElement(_writer, _elementName);
xmlTextWriterWriteString(_writer, _elementValue);
xmlTextWriterEndElement(_writer);
}
xmlTextWriterEndElement(_writer);
}
xmlTextWriterEndElement(_writer);
xmlTextWriterEndDocument(_writer);
xmlFreeTextWriter(_writer);
NSData *_xmlData = [NSData dataWithBytes:(_buffer->content) length:(_buffer->use)];
xmlBufferFree(_buffer);
return _xmlData;
}</span>说明:
1、调用xmlTextWriterStartDocument()函数会将XML版本号与编码定义添加到文档中。接下来根据需要开始调用xmlTextWriterStartElement()、xmlTextWriterWriteString()与xmlTextWriterEndElement()函数创建XML结构。xmlTextWriterEndElement()函数不需要关闭元素名,它会帮你完成。
1.创建一个类Post
<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface Post : NSObject
@property (copy, nonatomic) NSString *title;
@property (copy, nonatomic) NSString *postDescription;
@property (copy, nonatomic) NSDate *pubDate;
@property (copy, nonatomic) NSString *contentURL;
@end</span><span style="font-size:24px;">
</span>2.解析 创建一个类TopStoriesParset
.h文件
#import <Foundation/Foundation.h>
@protocol TopStoriesDelegate <NSObject>
@required - (void)topStoriesParsedWithResult:(NSMutableArray *)posts; // 解析完成使用该方法获取结果 @end @interface TopStoriesParser : NSObject <NSXMLParserDelegate> @property (strong, nonatomic) NSData *feedData; @property (strong, nonatomic) NSMutableArray *posts; - (instancetype)initWithFeedData:(NSData *)data; - (void)parseTopStoriesFeed; @property (assign, nonatomic) id<TopStoriesDelegate>delegate; @end
.m文件
#import "TopStoriesParser.h"
#import "Post.h"
@interface TopStoriesParser ()
{
Post *post;
NSMutableString *currentValue;
BOOL parsingItem;
}
@end
@implementation TopStoriesParser
- (instancetype)initWithFeedData:(NSData *)data
{
if (self = [super init]) {
self.feedData = data;
}
return self;
}
- (void)parseTopStoriesFeed
{
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:_feedData];
parser.delegate = self;
[parser parse];
}
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
_posts = [[NSMutableArray alloc] init];
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
if ([_delegate respondsToSelector:@selector(topStoriesParsedWithResult:)]) {
[_delegate topStoriesParsedWithResult:_posts];
}
}
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
if ([elementName isEqualToString:@"item"]) {
post = [[Post alloc] init];
parsingItem = YES;
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSString *tmpValue = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if (currentValue == nil) {
currentValue = [[NSMutableString alloc] initWithString:tmpValue];
} else {
[currentValue appendString:tmpValue];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"item"]) {
[_posts addObject:post];
post = nil;
parsingItem = NO;
}
if (parsingItem == YES) {
if ([elementName isEqualToString:@"title"]) {
post.title = currentValue;
} else if ([elementName isEqualToString:@"description"]) {
post.postDescription = currentValue;
} else if ([elementName isEqualToString:@"pubDate"]) {
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"];
post.pubDate = [df dateFromString:currentValue];
} else if ([elementName isEqualToString:@"feedburner:origLink"]) {
post.contentURL = currentValue;
}
}
currentValue = nil;
}
@end说明:
1、当开始解析时,它会在初始化NSMutableArray(用户存储处理过的Post对象)时调用parserDidStartDocument:方法,与之类似,当解析到文档末尾时,parserDidEndDocument:方法会的到调用,这是解析完成,从而通知委托。
2、当开始处理新元素时会调用parser:didStartElement:namespaceURI:qualifiedName:attributes:方法。这是处理属性的地方:记住,属性是起始标签的一部分。当从元素中读取内容时会调用parser:foundCharacters:方法,当元素关闭时会调用parser:didEndElement:namespaceURI:qualifiedName:方法。当所有元素都关闭时就可以安全的处理和存储任何累计下来的内容了。
二、生成XML文件
libxml是IOS自带的用于生成XML的原生唯一API,它是基于C语言的API
在build phases的Link Binary With Libraries导入libxml2.2.tbd
然后在解析的文件中添加:#import <libxml/xmlwriter.h>
+ (NSData *)postXMLDataFromDictionary:(NSDictionary *)dictionary
<span style="font-size:14px;">{
xmlTextWriterPtr _writer;
xmlBufferPtr _buffer;
xmlChar *_elementName;
xmlChar *_elementValue;
_buffer = xmlBufferCreate();
_writer = xmlNewTextWriterMemory(_buffer, 0);
xmlTextWriterStartDocument(_writer, "1.0", "UTF-8", NULL);
xmlTextWriterStartElement(_writer, BAD_CAST "articles");
NSArray *posts = [dictionary objectForKey:@"articles"];
for (NSDictionary *post in posts) {
xmlTextWriterStartElement(_writer, BAD_CAST "article");
NSArray *keys = [post allKeys];
for (NSString *key in keys) {
_elementName = (xmlChar *)[key UTF8String];
_elementValue = (xmlChar *)[[post objectForKey:key] UTF8String];
xmlTextWriterStartElement(_writer, _elementName);
xmlTextWriterWriteString(_writer, _elementValue);
xmlTextWriterEndElement(_writer);
}
xmlTextWriterEndElement(_writer);
}
xmlTextWriterEndElement(_writer);
xmlTextWriterEndDocument(_writer);
xmlFreeTextWriter(_writer);
NSData *_xmlData = [NSData dataWithBytes:(_buffer->content) length:(_buffer->use)];
xmlBufferFree(_buffer);
return _xmlData;
}</span>说明:
1、调用xmlTextWriterStartDocument()函数会将XML版本号与编码定义添加到文档中。接下来根据需要开始调用xmlTextWriterStartElement()、xmlTextWriterWriteString()与xmlTextWriterEndElement()函数创建XML结构。xmlTextWriterEndElement()函数不需要关闭元素名,它会帮你完成。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器