人間がXMLを解析するiPhone

NSXMLParserとの戦いにうんざりしていた私は、それを使用して、NSMutableDictionaryの形式で人にとって快適な形式でデータを返す独自のクラスを作成することにしました。 したがって、誰でも自分で変更できます。





パーサーの結果は、次の形式のNSMutableDictionaryになります。

Dictionary:

key: "parentNode" value: (NSMutableDictionary*) //

key: "name" value: (NSString*) //

key: "attributes" value: (NSDictionary*) //

key: "childs" value: (NSMutableArray*) // NSMutableDictionary

key: "content" value: (NSString*) // CDDATA









次のように使用できます。

XMLParser * myParser = [[XMLParser alloc]init];

[myParser setDelegate(self)];



if (![myParser parseUrl: @"http://....xml" )

{

NSLog( @"Some error" );

}



, :



-( void )parseFinished:(id) parser result:(NSMutableDictionary*) rootNode

{

...

}




* This source code was highlighted with Source Code Highlighter .








したがって、コードは次のとおりです。



「XMLParser.h」

#import <Foundation/Foundation.h>

#import "XMLParserProtocol.h"



@ interface XMLParser : NSObject {



NSMutableDictionary * currentNode;

id<XMLParserProtocol> delegate ;



}



@property (assign) id<XMLParserProtocol> delegate ;



-(BOOL) parseUrl:(NSString*)urlToParse;



@end




* This source code was highlighted with Source Code Highlighter .








「XMLParser.m」

#import "XMLParser.h"



@implementation XMLParser



@synthesize delegate ;



-(BOOL)parseUrl:(NSString *)urlToParse

{



/**



**/



currentNode = [[NSMutableDictionary alloc] init];



[currentNode setObject: @"RootNode" forKey: @"name" ];

[currentNode setObject:[[NSMutableArray alloc]init] forKey: @"childs" ];



/**



**/

NSURL * url = [[NSURL alloc] initWithString:urlToParse];



NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:url];



[parser setDelegate:self];





return [parser parse];

}



-( void )parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{

NSMutableDictionary * newNode = [[NSMutableDictionary alloc] init];



[newNode setObject: currentNode forKey: @"parentNode" ];

[newNode setObject: [elementName copy] forKey: @"name" ];

[newNode setObject: [attributeDict copy] forKey: @"attributes" ];

[newNode setObject: [[NSMutableArray alloc]init] forKey: @"childs" ];



NSMutableArray * childs = [currentNode objectForKey: @"childs" ];



[childs addObject:newNode];



currentNode = newNode;

}



-( void )parser:(NSXMLParser *)parser foundCharacters:(NSString *) string

{

[currentNode setObject:[ string copy] forKey: @"content" ];

}



-( void )parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

currentNode = [currentNode objectForKey: @"parentNode" ];

}



-( void )parserDidEndDocument:(NSXMLParser *)parser

{

if ( delegate )

{

[ delegate parseFinished:self result: currentNode];

}

}



@end




* This source code was highlighted with Source Code Highlighter .









#import "XMLParser.h"



@implementation XMLParser



@synthesize delegate ;



-(BOOL)parseUrl:(NSString *)urlToParse

{



/**



**/



currentNode = [[NSMutableDictionary alloc] init];



[currentNode setObject: @"RootNode" forKey: @"name" ];

[currentNode setObject:[[NSMutableArray alloc]init] forKey: @"childs" ];



/**



**/

NSURL * url = [[NSURL alloc] initWithString:urlToParse];



NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:url];



[parser setDelegate:self];





return [parser parse];

}



-( void )parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{

NSMutableDictionary * newNode = [[NSMutableDictionary alloc] init];



[newNode setObject: currentNode forKey: @"parentNode" ];

[newNode setObject: [elementName copy] forKey: @"name" ];

[newNode setObject: [attributeDict copy] forKey: @"attributes" ];

[newNode setObject: [[NSMutableArray alloc]init] forKey: @"childs" ];



NSMutableArray * childs = [currentNode objectForKey: @"childs" ];



[childs addObject:newNode];



currentNode = newNode;

}



-( void )parser:(NSXMLParser *)parser foundCharacters:(NSString *) string

{

[currentNode setObject:[ string copy] forKey: @"content" ];

}



-( void )parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

currentNode = [currentNode objectForKey: @"parentNode" ];

}



-( void )parserDidEndDocument:(NSXMLParser *)parser

{

if ( delegate )

{

[ delegate parseFinished:self result: currentNode];

}

}



@end




* This source code was highlighted with Source Code Highlighter .









#import "XMLParser.h"



@implementation XMLParser



@synthesize delegate ;



-(BOOL)parseUrl:(NSString *)urlToParse

{



/**



**/



currentNode = [[NSMutableDictionary alloc] init];



[currentNode setObject: @"RootNode" forKey: @"name" ];

[currentNode setObject:[[NSMutableArray alloc]init] forKey: @"childs" ];



/**



**/

NSURL * url = [[NSURL alloc] initWithString:urlToParse];



NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:url];



[parser setDelegate:self];





return [parser parse];

}



-( void )parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{

NSMutableDictionary * newNode = [[NSMutableDictionary alloc] init];



[newNode setObject: currentNode forKey: @"parentNode" ];

[newNode setObject: [elementName copy] forKey: @"name" ];

[newNode setObject: [attributeDict copy] forKey: @"attributes" ];

[newNode setObject: [[NSMutableArray alloc]init] forKey: @"childs" ];



NSMutableArray * childs = [currentNode objectForKey: @"childs" ];



[childs addObject:newNode];



currentNode = newNode;

}



-( void )parser:(NSXMLParser *)parser foundCharacters:(NSString *) string

{

[currentNode setObject:[ string copy] forKey: @"content" ];

}



-( void )parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

currentNode = [currentNode objectForKey: @"parentNode" ];

}



-( void )parserDidEndDocument:(NSXMLParser *)parser

{

if ( delegate )

{

[ delegate parseFinished:self result: currentNode];

}

}



@end




* This source code was highlighted with Source Code Highlighter .














「XMLParserProtocol.h」

#import <UIKit/UIKit.h>

#import "XMLParser.h"



@protocol XMLParserProtocol



@optional



-( void ) parseFinished:(id) parser result:(NSMutableDictionary *) rootNode;



@end




* This source code was highlighted with Source Code Highlighter .







All Articles