IOS原生API解析和创建XML

原创 2015年11月18日 10:42:28

一、解析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开发------XML原生解析(NSXMLParser篇)

由于项目需要,最近就研究了一些与视频流相关的知识,在学习的过程中发现,JSON作为轻量级的数据传输格式就显的非常不便.当然,这句话的意思就是说在学习过程中碰到的XML格式数据居多了呗,这时掌握一些XM...

iOS网络数据解析--XML解析详解(GDataXMLNode&原生NSXMLParser)

在iOS开发中,大多数情况下,从网络获取的数据通常分两种。 JSON格式或者XML格式。 JSON是一种轻量级的数据格式,一般用于数据交互 JSON数据类似OC中的字典,解析方式也有很多ios5...

iOS 【原生API NSURLConnection 网络请求】

原生API NSURLConnection 网络请求

iOS 【原生API NSURLSession 网络请求(重新弄一份 格式不对!!!!!!!!!!)】

原生API NSURLSession 网络请求

使用IOS7原生API进行二维码条形码的扫描

iOS7系统二维码扫描功能实现

iOS原生api post上传图片,上传视频

我之前在做文件上传的时候,不想用第三方的,于是就写了一个简单的图片上传方法 ------------.h文件里面写一个这样方法------- /**  *  异步上传文件,视频,...

iOS原生文件系统解析.zip

  • 2012-02-20 16:58
  • 7.54MB
  • 下载

使用 IOS7 原生API进行二维码条形码的扫描

IOS7之前,开发者进行扫码编程时,一般会借助第三方库。常用的是ZBarSDK,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析二维码的接口。经过测试,使用原生API扫描和处...

iOS二维码扫描 原生API 源码Demo 2016最新版本 简单易用

事到如今,2016年了 iOS中的二维码扫描,什么ZXing, ZBar库都过时了,本博主,今天写了一个二维码扫描库,是最新版本的,兼容iOS7.0及以后的系统,主要用Objective-C写的,以后...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)