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

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>
@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()函数不需要关闭元素名,它会帮你完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios