Thursday, 25 June 2015

XML Parser

ViewController.h

#import <UIKit/UIKit.h>
#define ITEM_NAME @"name"
#define FOOD @"food"
#define ITEM_PRICE @"price"
#define ITEM_DESCRIPTION @"description"
#define ITEM_CALORIES @"calories"

@interface ViewController : UIViewController<NSXMLParserDelegate,UITableViewDataSource,UITableViewDelegate>
{
    IBOutlet UITableView *tblxml;
    NSMutableArray *arraydata;
}
@end


ViewController.m

  #import "ViewController.h"

@interface ViewController ()
{
    NSXMLParser *parser;
   
    NSMutableDictionary *currentData;
    NSString *currentElement;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSString *xmlFilePath = [[NSBundle mainBundle] pathForResource:@"food" ofType:@"xml"];
   
    parser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL fileURLWithPath:xmlFilePath]];
   
    [parser setDelegate:self];
    [parser parse];
   
    if (!arraydata)
    {
        arraydata = [[NSMutableArray alloc]init];
    }

}


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDic
{
    NSLog(@"Did start element");
   
    currentElement = elementName;
   
    if ( [elementName isEqualToString:FOOD])
    {
        if (!currentData) {
            currentData = [[NSMutableDictionary alloc]init];
        }
       
        NSLog(@"found rootElement");
        return;
    }
}


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"Did end element");
   
    if ([elementName isEqualToString:ITEM_PRICE]) {
        currentElement = elementName;
    }else if ([elementName isEqualToString:ITEM_NAME]){
        currentElement = elementName;    }
    else if ([elementName isEqualToString:ITEM_DESCRIPTION]){
        currentElement = elementName;
    }else if ([elementName isEqualToString:ITEM_CALORIES]){
        currentElement = elementName;
    }else{
        currentElement = @"";
    }
   
    if ([elementName isEqualToString:FOOD])
    {
        if (arraydata == nil) {
            arraydata= [[NSMutableArray alloc]init];
        }
       
        [arraydata addObject:[currentData copy]];
        [currentData removeAllObjects];
    }

}


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if ([string rangeOfString:@"\n"].location == NSNotFound) {
        if ([currentElement isEqualToString:ITEM_PRICE]) {
            [currentData setObject:string forKey:ITEM_PRICE];
        }else if ([currentElement isEqualToString:ITEM_NAME]){
            [currentData setObject:string forKey:ITEM_NAME];
        }else if ([currentElement isEqualToString:ITEM_DESCRIPTION]){
            [currentData setObject:string forKey:ITEM_DESCRIPTION];
        }else if ([currentElement isEqualToString:ITEM_CALORIES]){
            [currentData setObject:string forKey:ITEM_CALORIES];
        }
    }
   
}

-(void)parserDidStartDocument:(NSXMLParser *)parser
{
    NSLog(@"StartDocument");
   
}

- (void)parserDidEndDocument:(NSXMLParser *)parser{
   
    NSLog(@"%@",arraydata);
   
    [tblxml reloadData];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return arraydata.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
   
    NSDictionary *currentItemDetails = [arraydata objectAtIndex:indexPath.row];
   
    cell.textLabel.text = [currentItemDetails objectForKey:ITEM_NAME];
    cell.textLabel.text = [currentItemDetails objectForKey:ITEM_PRICE];
    cell.textLabel.text = [currentItemDetails objectForKey:ITEM_DESCRIPTION];
    cell.textLabel.text = [NSString stringWithFormat:@"Calories :: %@",  [currentItemDetails objectForKey:ITEM_CALORIES]];
   
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 125;
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end


No comments:

Post a Comment