[Object C]object c中完成將xml轉換為json
參考:http://troybrant.net/blog/2010/09/simple-xml-to-nsdictionary-converter/
現在只知道了怎麼用,具體原理還有待深究。
將xml轉換為json,分為兩步:
1.將xml轉換為NSDictionary。
2.將NSDictionary 轉換為json
#import <Foundation/Foundation.h>
@interface XMLReader : NSObject
{
NSMutableArray *dictionaryStack;
NSMutableString *textInProgress;
NSError **errorPointer;
}
+ (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)errorPointer;
+ (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)errorPointer;
+ (NSString *)jsonStringForXMLDictionary:(NSDictionary *)dictionary error:(NSError **)errorPointer;
@end
#import "XMLReader.h"
NSString *const kXMLReaderTextNodeKey = @"text";
@interface XMLReader (Internal)
- (id)initWithError:(NSError **)error;
- (NSDictionary *)objectWithData:(NSData *)data;
@end
@implementation XMLReader
#pragma mark -
#pragma mark Public methods
+ (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)error
{
XMLReader *reader = [[XMLReader alloc] initWithError:error];
NSDictionary *rootDictionary = [reader objectWithData:data];
[reader release];
return rootDictionary;
}
+ (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)error
{
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
return [XMLReader dictionaryForXMLData:data error:error];
}
//added by chenjie
+ (NSString *)jsonStringForXMLDictionary:(NSDictionary *)dictionary error:(NSError **)error
{
// NSDictionary *dictionary = [XMLReader dictionaryForXMLString:testXMLString error:&parseError];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted
//pass 0 if you don't care about the readability of the generated string
error:error];
if(!jsonData)
{
NSLog(@"Got an error:%@",*error);
return nil;
}
else
{
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
// NSLog(@"%@", jsonString);
}
}
#pragma mark -
#pragma mark Parsing
- (id)initWithError:(NSError **)error
{
if (self = [super init])
{
errorPointer = error;
}
return self;
}
- (void)dealloc
{
[dictionaryStack release];
[textInProgress release];
[super dealloc];
}
- (NSDictionary *)objectWithData:(NSData *)data
{
// Clear out any old data
[dictionaryStack release];
[textInProgress release];
dictionaryStack = [[NSMutableArray alloc] init];
textInProgress = [[NSMutableString alloc] init];
// Initialize the stack with a fresh dictionary
[dictionaryStack addObject:[NSMutableDictionary dictionary]];
// Parse the XML
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
BOOL success = [parser parse];
// Return the stack’s root dictionary on success
if (success)
{
NSDictionary *resultDict = [dictionaryStack objectAtIndex:0];
return resultDict;
}
return nil;
}
#pragma mark -
#pragma mark NSXMLParserDelegate methods
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
// Get the dictionary for the current level in the stack
NSMutableDictionary *parentDict = [dictionaryStack lastObject];
// Create the child dictionary for the new element, and initilaize it with the attributes
NSMutableDictionary *childDict = [NSMutableDictionary dictionary];
[childDict addEntriesFromDictionary:attributeDict];
// If there’s already an item for this key, it means we need to create an array
id existingValue = [parentDict objectForKey:elementName];
if (existingValue)
{
NSMutableArray *array = nil;
if ([existingValue isKindOfClass:[NSMutableArray class]])
{
// The array exists, so use it
array = (NSMutableArray *) existingValue;
}
else
{
// Create an array if it doesn’t exist
array = [NSMutableArray array];
[array addObject:existingValue];
// Replace the child dictionary with an array of children dictionaries
[parentDict setObject:array forKey:elementName];
}
// Add the new child dictionary to the array
[array addObject:childDict];
}
else
{
// No existing value, so update the dictionary
[parentDict setObject:childDict forKey:elementName];
}
// Update the stack
[dictionaryStack addObject:childDict];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
// Update the parent dict with text info
NSMutableDictionary *dictInProgress = [dictionaryStack lastObject];
// Set the text property
if ([textInProgress length] > 0)
{
// Get rid of leading + trailing whitespace
[dictInProgress setObject:textInProgress forKey:kXMLReaderTextNodeKey];
// Reset the text
[textInProgress release];
textInProgress = [[NSMutableString alloc] init];
}
// Pop the current dict
[dictionaryStack removeLastObject];
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
// Build the text value
[textInProgress appendString:string];
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
// Set the error pointer to the parser’s error object
*errorPointer = parseError;
}
#import <Foundation/Foundation.h>
#import "XMLReader.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
//convert xml to NSDictionary
// NSString *testXMLString = @"<items><item id=\"0001\" type=\"donut\"><name>Cake</name><ppu>0.55</ppu><batters><batter id=\"1001\">Regular</batter><batter id=\"1002\">Chocolate</batter><batter id=\"1003\">Blueberry</batter></batters><topping id=\"5001\">None</topping><topping id=\"5002\">Glazed</topping><topping id=\"5005\">Sugar</topping></item></items>";
NSString *testXMLString = @"<sentence content1=\"sent\"><word content2=\"wor\"/></sentence>";
// Parse the XML into a dictionary
NSError *xmlConvert2DictError = nil;
NSError *dictConvert2StringError = nil;
NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLString:testXMLString error:&xmlConvert2DictError];
// Print the dictionary
NSLog(@"%@", xmlDictionary);
NSString *jsonString = nil;
// jsonString = jsonStringForXMLDictionary:(NSDictionary *)dictionary error:(NSError **)error
jsonString = [XMLReader jsonStringForXMLDictionary:xmlDictionary error:&dictConvert2StringError];
NSLog(@"%@", jsonString);
}
return 0;
}
相關文章
- 【object c】Objective C中xml到json的轉換(二)ObjectXMLJSON
- C# json to dynamic objectC#JSONObject
- 在 AngularJS 中將 XML 轉換為 JSONAngularXMLJSON
- Effective Object C 2.0 『熟悉Object C』Object
- Object-C中emoji與json的問題ObjectJSON
- Gson轉換 — json資料轉換為Object實體公共方法JSONObject
- object-c中NSString與int和float的相互轉換Object
- C# 將HTML轉為XMLC#HTMLXML
- C# 將Excel轉為XMLC#ExcelXML
- object-c中疑問Object
- Python將xml格式轉換為json格式PythonXMLJSON
- PHP利用JSON將XML轉換為陣列PHPJSONXML陣列
- js將xml格式內容轉換為json格式XMLJSON
- C#中JSON轉換類C#JSON
- Java如何將Object轉換成指定Class物件JavaObject物件
- 用C#把檔案轉換為XML(轉)C#XML
- object-c基礎Object
- Object-C複習Object
- C++物件模型:objectC++物件模型Object
- C++永久物件儲存 (Persistent Object Storage for C++) (轉)C++物件Object
- Object-C,物件和方法Object物件
- Object-C,陣列NSArrayObject陣列
- Object-C初體驗Object
- 自定義Object與XML互換(序列化)ObjectXML
- Oracle Database 19c 中的 JSON_OBJECT 函式的增強功能OracleDatabaseJSONObject函式
- Eclipse安裝GSON,使用GSON轉換Java Object到JSONEclipseJavaObjectJSON
- XML DOM(Document Object Model)XMLObject
- 【object C】ObjectC中如何彌補switch引數不能為字串的方法Object字串
- JSON(JavaScript Object Notation)JSONJavaScriptObject
- 從Object-C -> Swift3.0ObjectSwift
- 五、Object-C 類NSObjectObject
- Object-C之(Null)與(Bool)ObjectNull
- 好用的一個object c 巨集Object
- Object-C,NSSet,不可變集合Object
- Object-C陣列和字典Object陣列
- Object-C,遍歷目錄Object
- Inside the C++ Object ModelIDEC++Object
- C# 將PDF文件轉換為Markdown文件C#