Wednesday, March 9, 2011

Using GData To parse an XML file

I was using the GData library today and i found that it has been deprecated by google don't know why and don't know when the new files for GData will be available so for temporary period of time this library will not be working. 


I am learning TBXML now and most probably in future i will post for it and also for  NSXMLParser as well so just give me some time for that.




Really sad to see such a brilliant library down.


In today’s post we will see how to parse an XML file using GData XML parser.

Note: Before beginning with the post it is recommended that you have some basic knowledge about XML, DOM and SAX parsers.

Design Phase: For this sample application we will parse an XML file which is present in the bundle and display its content in the table view, the parser that we will use in this case is GData

Before beginning with this tutorial you have to download the GData library.

Step 1: Open Xcode and select the windows based application template and add UITableViewSubclass file to it with the name myviewController, after doing this their would be two files that would be added into your class group [myviewController.h and myviewController.m].

Step 2: It’s time to add the GData library into your project so for that select the downloaded GData file from the download folder and inside the folder you will find a folder with the name source and then inside the source folder you will find a folder named “XML support”, drag and drop this folder into your application, 


once this is done then we will have to do some settings so that GData library works nicely with our application.

Perform the settings that are given below:

1) Select the project tab from the xcode menu and select the edit project settings option


2)You will see a window in front of you that’s your project window from their select the header search path option (you can type header search path in the search bar) and type the following that is given in the image below






3)Once you are done with header search path the other setting that you have to do is set the other linker flag (you may type other linker flag in the search bar), now once you find the other linker flag just type the following data in the image given below






4) Now its time to test whether you have made the correct settings or not and for that you have to import the GDatatXMLNode header file in the  .h file of the myviewController class and press build your application.

Step 3: Here’s a look at our XML file, which is present in the bundle, now inorder to read this file just follow the steps given below



First in the .h file declare the following objects, I have used comments to describe the objects,
#import <UIKit/UIKit.h>
#import "GDataXMLNode.h"

@interface myviewController : UITableViewController {

 //stores the entire data about the XML document
 GDataXMLDocument *xmlDocument;

 //string variable to hold the location of the XML File
 NSString *xmlFileLocation;

 //after parsing the data will be stored in the array
 NSMutableArray *data_from_xml;

 //stores the error information that occured
 NSError *error;
}
@end

Now into the .m file  select the init method and add this piece of code.

-(id)initWithStyle:(UITableViewStyle)style {
    // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
    if (self = [super initWithStyle:style]) {
 
 
  xmlFileLocation = [[NSBundle mainBundle]pathForResource:@"Cars" ofType:@"xml"];
 
  NSData *xmlData = [NSData dataWithContentsOfFile:xmlFileLocation];
 
  xmlDocument = [[GDataXMLDocument alloc]initWithData:xmlData options:0 error:&error];
 
  NSArray *getData = [[xmlDocument rootElement]elementsForName:@"car"];
 
  data_from_xml = [[NSMutableArray alloc]init];
 
  for(GDataXMLElement *e in getData)
  {
   [data_from_xml addObject:e];
  }
    }
    return self;
}

Step 4: Now once the above step is completed then just add the number of sections and rows for section in the table view datasource method of the table view, here’s a view of doing that

 
#pragma mark Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [data_from_xml count];
}

Now its time to see some real GData
In the cell for row at index path method when you give title to each cells then in this case the titles will be coming from the XML file so for that what you have to do is select the appropriate elements from the XML file and display them in the table view and here’s how you do that

 
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }
    
    // Set up the cell...
 cell.textLabel.text = [[[[data_from_xml objectAtIndex:indexPath.row]elementsForName:@"company"]objectAtIndex:0]stringValue];
 cell.detailTextLabel.text = [[[[data_from_xml objectAtIndex:indexPath.row]elementsForName:@"model"]objectAtIndex:0]stringValue];
    
 return cell;
}

Step 5: Select the app delegate.m file and add the table view to the window here’s how you will do that

#import "GDataAppAppDelegate.h"
#import "myviewController.h"

@implementation GDataAppAppDelegate

@synthesize window;


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

    // Override point for customization after application launch
 myviewController *obj = [[myviewController alloc]initWithStyle:UITableViewStyleGrouped];
 [window addSubview:obj.view];
    [window makeKeyAndVisible];
}

Click build and go you will see the output as given below




Now lets say the structure of your XML file is somewhat like this




Then in this case what you have to do is use a nested for loop in order to get the data from each and every car element present in the XML file here’s a look at the code

NSArray *getData = [[xmlDocument rootElement]elementsForName:@"FavouriteCar"];
tempArray = [[NSMutableArray alloc]init];
for(GDataXMLElement *e in getData)
{
for(int i =0;i<[[e elementsForName:@"car"]count];i++)
{

//fetching the car model
testString = [[[[e elementsForName:@"car"]objectAtIndex:i]childAtIndex:1]stringValue];
//storing the car model in the mutable array
[tempArray addObject:testString];

}
}

Code Explanation: The above code is self explanatory, I am storing the car model from the xml element in the NSString variable and then in the next line I am adding those values to the instance of a mutable array so that I can show the data in the table.

i hope this post helped you out in parsing an XML file using GData XML parser their are many different parsers available for xml parsing in iPhone you may check them out if you like,

Your comments good or bad are always welcome as they help me in improving my writing skills. 

Until then happy iCoding and have a great Day.

15 comments:

  1. wow its very very helpful 4 me..thanks radix.....

    ReplyDelete
  2. this is great and it helped me understand the xml parsing very well. Thanks for the wonderful post with such clean explanation.

    ReplyDelete
  3. Thanks Ravi.i think using GData To parse an XML is efficient as far as Peak Memory Usage concern in Obj-C

    ReplyDelete
  4. bunch of thanx Ravi for writhing these texts... before this i was pulling my hair coz i got stuck on this link http://www.raywenderlich.com/725/how-to-read-and-write-xml-documents-with-gdataxml

    i didn't aware that GData library has been deprecated by google

    now i got it ... thanks

    ReplyDelete
  5. this post is really very useful ..Thanks

    ReplyDelete
  6. this post is clearly understnable and proper descrption... thanx

    ReplyDelete
    Replies
    1. Yours however had 2 types ;) lol

      Delete
  7. when im adding gdata library to my project it is showing an error. the error is libxml/tree.h file not found. can u plz help me...

    ReplyDelete
  8. Can u Plz help me in integrating gdata library

    ReplyDelete
  9. @Maddula Harish : Are you following all the steps given above ?

    ReplyDelete
  10. Hi Radix, firstly thanks for some useful post. i have got the similar problem can you help me with that please. i am new to iPhone development in my situation i have got the xml like ..

    XXXXXXX

    XXXXXXXX


    from the above xml i parsed the two elements and displayed in a tableview that are "ElectroFusionAcquire" and "WeldNumber" for those two fields i created two textfields . when i the user entered data in to those textfields that text needs to be save in the PLACE OF "XXXXXXXX" above xml could you please suggest me the way to achieve this. because there is no good suggestion in google.
    Thanks for your consideration

    ReplyDelete
  11. if you don't mind i am not able to post my question properly. thats why i sent an email to ravi.hhh@gmail.com

    ReplyDelete
  12. Thank you for your sharing, this information is very helpful to me.
    ZOPO ZP980

    ReplyDelete
  13. How to solve the problem libxml/tree.h ?? I did everything right

    ReplyDelete