Tuesday 14 June 2011

How To Parsing Data Using XMLParser

Parsing an XML file
This is the “XMLParsing” example. In this app we will read data from xml file and display the data on the screen.

This is the “XMLParsing” example. In this app we will read data from xml file and display the data on the screen.

Step 1: Open the Xcode and create a new Xcode project using Navigation base application template. Give the application name “XML”. As shown in the figure below:



Step 2: Expand classes and notice Interface Builder created the RootViewController.h and RootViewController.m class for you. Expand Resources and notice the template generated a separate nib, RootViewController.xib.

Step 3: We need to add another file. Right-click on the Classes folder and choose Add -> New File. Under Cocoa Touch Class category choose Objective-C class. Name it Book.h and Book.m file.
This will be a very simple class that will take our dummy data file, read it in as an NSArray and provide some utility methods to access the data from the file.

#import
@interface Book : NSObject {

NSInteger bookID;
NSString *name; //Same name as the Entity Name.
NSString *address; //Same name as the Entity Name.
NSString *country; //Same name as the Entity Name.

}
@property (nonatomic, readwrite) NSInteger bookID;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *address;
@property (nonatomic, retain) NSString *country;

@end

Step 4: We need to add Book.m file.

#import "Book.h"
@implementation Book
@synthesize name, address, country, bookID;
- (void) dealloc {

[country release];
[address release];
[name release];
[super dealloc];
}
@end

Step 5: We need to add another file. Right-click on the Resource folder and choose Add -> New File. Under Resource category choose View-XIB class. Name it BookDetailView.xib file. Double click the file and select Grouped table view.



Step 6: We need to add another file. Right-click on the Classes folder and choose Add -> New File. Under Cocoa Touch Class category choose Objective-C class. Name it XMLParser.h and XMLParser.m file. This will be a very simple class that will take our dummy data file, read it in as an NSArray and provide some utility methods to access the data from the file.

#import
@class XMLAppDelegate, Book;

@interface XMLParser : NSObject {

NSMutableString *currentElementValue;

XMLAppDelegate *appDelegate;
Book *aBook;
}

- (XMLParser *) initXMLParser;

@end

Step 7: We need to open XMLParser.m file.

#import "XMLParser.h"
#import "XMLAppDelegate.h"
#import "Book.h"
@implementation XMLParser

- (XMLParser *) initXMLParser {

[super init];

appDelegate = (XMLAppDelegate *)[[UIApplication sharedApplication] delegate];

return self;
}

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

if([elementName isEqualToString:@"Books"]) {
//Initialize the array.
appDelegate.books = [[NSMutableArray alloc] init];
}
else if([elementName isEqualToString:@"Book"]) {

//Initialize the book.
aBook = [[Book alloc] init];

//Extract the attribute here.
aBook.bookID = [[attributeDict objectForKey:@"id"] integerValue];

NSLog(@"Reading id value :%i", aBook.bookID);
}

NSLog(@"Processing Element: %@", elementName);
}

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

if(!currentElementValue)
currentElementValue = [[NSMutableString alloc] initWithString:string];
else
[currentElementValue appendString:string];

NSLog(@"Processing Value: %@", currentElementValue);

}

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

if([elementName isEqualToString:@"Books"])
return;

//There is nothing to do if we encounter the Books element here.
//If we encounter the Book element howevere, we want to add the book object to the array
// and release the object.
if([elementName isEqualToString:@"Book"]) {
[appDelegate.books addObject:aBook];

[aBook release];
aBook = nil;
}
else
[aBook setValue:currentElementValue forKey:elementName];

[currentElementValue release];
currentElementValue = nil;
}

- (void) dealloc {

[aBook release];
[currentElementValue release];
[super dealloc];
}

@end

Step 8: We need to add another file. Right-click on the Classes folder and choose Add -> New File. Under Cocoa Touch Class category choose UIViewController class. Name it BookDetailViewController.h and BookDetailViewController.m file.

#import
@class Book;

@interface BookDetailViewController : UIViewController {

IBOutlet UITableView *tableView;

Book *aBook;
}

@property (nonatomic, retain) Book *aBook;

@end

Step 9: We need to open BookDetailViewController.m file.

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
switch(indexPath.section)
{
case 0:
cell.text = aBook.name;
break;
case 1:
cell.text = aBook.address;
break;
case 2:
cell.text = aBook.country;
break;
}
return cell;
}
- (NSString *)tableView:(UITableView *)tblView titleForHeaderInSection:(NSInteger)section {

NSString *sectionName = nil;

switch(section)
{
case 0:
sectionName = [NSString stringWithString:@"Name"];
break;
case 1:
sectionName = [NSString stringWithString:@"Address"];
break;
case 2:
sectionName = [NSString stringWithString:@"Country"];
break;
}
return sectionName;
}

Step 10: We need to open XmlAppDelegate.h file.

#import
@interface XMLAppDelegate : NSObject {

UIWindow *window;
UINavigationController *navigationController;

NSMutableArray *books;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@property (nonatomic, retain) NSMutableArray *books;

@end

Step 11: We need to open XmlAppDelegate.m file.

#import "XMLAppDelegate.h"
#import "RootViewController.h"
#import "XMLParser.h"
@implementation XMLAppDelegate

@synthesize window;
@synthesize navigationController, books;

- (void)applicationDidFinishLaunching:(UIApplication *)application {


NSURL *url = [[NSURL alloc] initWithString:@"http://www.edumobile.org/blog/uploads/XML-parsing-data/Data.xml"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

//Initialize the delegate.
XMLParser *parser = [[XMLParser alloc] initXMLParser];

//Set delegate
[xmlParser setDelegate:parser];

//Start parsing the XML file.
BOOL success = [xmlParser parse];

if(success)
NSLog(@"No Errors");
else
NSLog(@"Error Error Error!!!");

// Configure and show the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
}

Step 12: Now build and run the code and view the Output in the Simulator.

No comments:

Post a Comment