前言
XML解析是數據解析的一種常見形式,有時候要把XML轉換成對應的形式是一種很麻煩的事情,特別是在使用iOS原生代碼時,尤其明顯。小編在這里分享一個小小的類文件可以解決大家的麻煩,可以把XML轉換成字典(NSDictionary)或者JSON字符串。最下方有類文件的下載地址。
使用方法舉例
NSString *str = [SskyXMLParser jsonStringForXMLData:data error:error];
NSLog(@"%@",str);
類文件的.h文件如下
#import <Foundation/Foundation.h>
enum {
SskyXMLParserOptionsProcessNamespaces = 1 << 0, // 指定接收器呈現命名空間和指定的標簽名稱
SskyXMLParserOptionsReportNamespacePrefixes = 1 << 1, // 指定接收器呈現命名空間的范圍
SskyXMLParserOptionsResolveExternalEntities = 1 << 2, // 指定接收器呈現外部實體的聲明
};
typedef NSUInteger SskyXMLParserOptions;
@interface SskyXMLParser : NSObject
/**
NSData格式的XML轉換成字典
@param data NSData格式的XML
@param error 錯誤碼
@return 字典
*/
+ (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError *)error;
/**
NSString格式的XML轉換成字典
@param string NSString格式的XML
@param error 錯誤碼
@return 字典
*/
+ (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError *)error;
/**
NSData格式的XML按照指定的形式轉換成字典
@param data NSData格式的XML
@param options 指定的形式
@param error 錯誤碼
@return 字典
*/
+ (NSDictionary *)dictionaryForXMLData:(NSData *)data options:(SskyXMLParserOptions)options error:(NSError *)error;
/**
NSString格式的XML按照指定的形式轉換成字典
@param string NSString格式的XML
@param options 指定的形式
@param error 錯誤碼
@return 字典
*/
+ (NSDictionary *)dictionaryForXMLString:(NSString *)string options:(SskyXMLParserOptions)options error:(NSError *)error;
/**
NSData格式的XML轉換成JSON字符串
@param data NSData格式的XML
@param error 錯誤碼
@return JSON字符串
*/
+ (NSString *)jsonStringForXMLData:(NSData *)data error:(NSError *)error;
/**
NSString格式的XML轉換成JSON字符串
@param string NSString格式的XML
@param error 錯誤碼
@return JSON字符串
*/
+ (NSString *)jsonStringForXMLString:(NSString *)string error:(NSError *)error;
/**
NSData格式的XML按照指定的形式轉換成JSON字符串
@param data NSData格式的XML
@param options 指定的形式
@param error 錯誤碼
@return JSON字符串
*/
+ (NSString *)jsonStringForXMLData:(NSData *)data options:(SskyXMLParserOptions)options error:(NSError *)error;
/**
NSString格式的XML按照指定的形式轉換成JSON字符串
@param string NSString格式的XML
@param options 指定的形式
@param error 錯誤碼
@return JSON字符串
*/
+ (NSString *)jsonStringForXMLString:(NSString *)string options:(SskyXMLParserOptions)options error:(NSError *)error;
@end
類文件的.m文件如下
#import "SskyXMLParser.h"
NSString *const kSskyXMLParserNodeKey = @"nodeValue";
@interface SskyXMLParser()<NSXMLParserDelegate>
//字典堆棧數組
@property (nonatomic, strong) NSMutableArray *dictionaryStack;
//文本
@property (nonatomic, strong) NSMutableString *textInProgress;
//錯誤
@property (nonatomic, strong) NSError *errorPointer;
@end
@implementation SskyXMLParser
#pragma mark - Public methods
+ (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError *)error
{
SskyXMLParser *xmlParser = [[SskyXMLParser alloc]initWithError:error];
NSDictionary *rootDictionary = [xmlParser objectWithData:data options:0];
return rootDictionary;
}
+ (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError *)error
{
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
return [SskyXMLParser dictionaryForXMLData:data error:error];
}
+ (NSDictionary *)dictionaryForXMLData:(NSData *)data options:(SskyXMLParserOptions)options error:(NSError *)error
{
SskyXMLParser *xmlParser = [[SskyXMLParser alloc]initWithError:error];
NSDictionary *rootDictionary = [xmlParser objectWithData:data options:options];
return rootDictionary;
}
+ (NSDictionary *)dictionaryForXMLString:(NSString *)string options:(SskyXMLParserOptions)options error:(NSError *)error
{
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
return [SskyXMLParser dictionaryForXMLData:data options:options error:error];
}
+ (NSString *)jsonStringForXMLData:(NSData *)data error:(NSError *)error
{
NSDictionary *dic = [SskyXMLParser dictionaryForXMLData:data error:error];
return [self dictionaryTransformedIntoJSONWithDictionary:[dic mutableCopy]];
}
+ (NSString *)jsonStringForXMLString:(NSString *)string error:(NSError *)error
{
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
return [SskyXMLParser jsonStringForXMLData:data error:error];
}
+ (NSString *)jsonStringForXMLData:(NSData *)data options:(SskyXMLParserOptions)options error:(NSError *)error
{
NSDictionary *dic = [SskyXMLParser dictionaryForXMLData:data options:options error:error];
return [self dictionaryTransformedIntoJSONWithDictionary:[dic mutableCopy]];
}
+ (NSString *)jsonStringForXMLString:(NSString *)string options:(SskyXMLParserOptions)options error:(NSError *)error
{
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
return [SskyXMLParser jsonStringForXMLData:data options:options error:error];
}
#pragma mark 字典轉JSON方法
+ (NSString *)dictionaryTransformedIntoJSONWithDictionary:(NSMutableDictionary *)dic
{
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString *str = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
return str;
}
#pragma mark - 解析
/**
初始化
@param error 錯誤制作
@return self
*/
- (instancetype)initWithError:(NSError *)error
{
if (self == [super init]) {
self.errorPointer = error;
}
return self;
}
/**
解析成字典
@param data 數據
@param options 類型
@return 字典
*/
- (NSDictionary *)objectWithData:(NSData *)data options:(SskyXMLParserOptions)options
{
// 每次處理前先重新初始化
self.dictionaryStack = [NSMutableArray array];
self.textInProgress = [NSMutableString string];
// 用新字典初始化堆棧
[self.dictionaryStack addObject:[NSMutableDictionary dictionary]];
// 解析XML
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
// 解析類型
[parser setShouldProcessNamespaces:(options & SskyXMLParserOptionsProcessNamespaces)];
[parser setShouldReportNamespacePrefixes:(options & SskyXMLParserOptionsReportNamespacePrefixes)];
[parser setShouldResolveExternalEntities:(options & SskyXMLParserOptionsResolveExternalEntities)];
// 綁定代理
parser.delegate = self;
// 開始解析
BOOL isSuccess = [parser parse];
// 判斷是否成功
if (isSuccess) {
NSDictionary *resultDict = [self.dictionaryStack firstObject];
return resultDict;
}
return nil;
}
#pragma mark - NSXMLParserDelegate methods
//文檔開始讀取
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
}
//解析標簽開始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
// 獲取當前字典
NSMutableDictionary *parentDict = [self.dictionaryStack lastObject];
// 創建子字典
NSMutableDictionary *childDict = [NSMutableDictionary dictionary];
// 拼接字典
[childDict addEntriesFromDictionary:attributeDict];
// 判斷存不存在鍵值對
id existingValue = [parentDict objectForKey:elementName];
// 存在說明該鍵值對為數組
if (existingValue) {
NSMutableArray *array = nil;
// 判斷該鍵值對的數組是否存在
if ([existingValue isKindOfClass:[NSMutableArray class]]) {
array = (NSMutableArray *)existingValue;
}else
{
array = [NSMutableArray array];
[array addObject:existingValue];
// 用新的數組替換舊的
[parentDict setObject:array forKey:elementName];
}
// 數組中添加新的子字典
[array addObject:childDict];
}else
{
// 不存在說明只是普通的鍵值對
[parentDict setObject:childDict forKey:elementName];
}
// 更新堆棧數組
[self.dictionaryStack addObject:childDict];
}
//獲取標簽對應的數據
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
[self.textInProgress appendString:string];
}
//解析標簽結束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSMutableDictionary *dictInProgress = [self.dictionaryStack lastObject];
if (self.textInProgress.length > 0) {
NSString *trmmedString = [self.textInProgress stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[dictInProgress setObject:[trmmedString mutableCopy] forKey:kSskyXMLParserNodeKey];
self.textInProgress = [NSMutableString string];
}
[self.dictionaryStack removeLastObject];
}
//文檔結束讀取
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
}
//遇到錯誤時停止解析
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
self.errorPointer = parseError;
}
@end
希望這篇文章對各位看官有所幫助,類文件下載地址:類文件,對支持小編的看官們表示感謝。