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.

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 <UIKit/UIKit.h>
@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 <UIKit/UIKit.h>

@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 <UIKit/UIKit.h>

@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 <UIKit/UIKit.h>

@interface XMLAppDelegate : NSObject <UIApplicationDelegate> {
   
    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://chakrainteractive.com/mob/0-vin/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.

You can download source code from here XML_Parsing

Leave a Reply

Your email address will not be published. Required fields are marked *