📜 ⬆️ ⬇️

iPhone parsing XML humanly

Tired of struggling with NSXMLParser, I decided to write my own class, which using it returns data in the form of NSMutableDictionary, in a pleasant form for a person. Accordingly, anyone who wishes may modify it for themselves.


The result of the parser will be an NSMutableDictionary of the following form:
Dictionary:
key: "parentNode" value: (NSMutableDictionary*) //
key: "name" value: (NSString*) //
key: "attributes" value: (NSDictionary*) //
key: "childs" value: (NSMutableArray*) // NSMutableDictionary
key: "content" value: (NSString*) // CDDATA


You can use as follows:
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 .

')
So, the code is as follows:

"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 .

Source: https://habr.com/ru/post/92938/


All Articles