Showing posts with label xmlparser. Show all posts
Showing posts with label xmlparser. Show all posts

Wednesday, November 10, 2010

XML file data as array in Cocoa using XML Parser

Add a xml file in your project

XML File - myxml.xml

<?xml version="1.0" encoding="utf-8" ?>
<data>
<object>
<name>English</name>
<age>24</age>
</object>
<object>
<name>Akram</name>
<age>20</age>
</object>
<object>
<name>John</name>
<age>30</age>
</object>
</data>


Code of file XMLParser.h


#import <UIKit/UIKit.h>
@interface XMLParser : NSObject {
NSMutableString *currentElementValue;
NSMutableArray *records;
NSMutableDictionary *data;
}
-(void)parseDataWithCase;
-(NSMutableArray *)records;
@end



Code of file XMLParser.m


#import "XMLParser.h"
@implementation XMLParser
-(void)parseDataWithCase{
NSString *filePath = @"myxml.xml";
// initializing array to be obtained after parsing
if(records)
[records removeAllObjects];
else
records=[[NSMutableArray alloc] init];

// xml parsing
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:filePath]]];
[parser setDelegate:self];
[parser setShouldResolveExternalEntities:YES];
BOOL success;
success = [parser parse]; // return value not used
[parser release];
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
}
- (void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string{
currentElementValue = [[NSString alloc] initWithString:string];
if( [currentElementValue isEqualToString:@"\n"] || [currentElementValue isEqualToString:@"NULL"] || [currentElementValue isEqualToString:@"(null)"] ){
[currentElementValue release];
}

}
- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName{
if ([elementName isEqualToString:@"data"]){
[data removeAllObjects];
} else if ([elementName isEqualToString:@"object"]){
[records addObject:[[data mutableCopy] autorelease]];
[data removeAllObjects];
} else {
if(data){
}else{
data=[[NSMutableDictionary alloc] initWithCapacity:2];
}
[data setObject:currentElementValue forKey:elementName];
[currentElementValue release];
}
}
-(NSMutableArray *)records{
return records;
}
- (void) dealloc {
[records release];
[data release];
[super dealloc];
}
@end



import the XMLParser.h class in your class
Call the function parseDataWithCase for parsing xml
and then call the records it return a array of that xml.



XMLParser *xmlParser = [[XMLParser alloc] init];
[xmlParser parseDataWithCase];
myArray = [xmlParser records];
[xmlParser release];




(
{
name = "Amit";
age = 24;
},
{
name = "Akram";
age = 20;
},
{
name = "John";
age = 30;
},
)


You can customize your parse method as you own need


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