0

Possible Duplicate:
iPhone Development - XMLParser vs. libxml2 vs. TouchXML

How can I parse the below response to get the data elements like Id, RegionId, and CountryName? Please help me to solve the problem in iPhone.

<feed xml:base="http://infra2appsmobile.cloudapp.net/Infra2Apps.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Countries</title>
  <id>http://infra2appsmobile.cloudapp.net/Infra2Apps.svc/Countries</id>
  <updated>2012-02-27T10:55:19Z</updated>
  <link rel="self" title="Countries" href="Countries" />
  <entry>
    <id>http://infra2appsmobile.cloudapp.net/Infra2Apps.svc/Countries(14)</id>
    <title type="text"></title>
    <updated>2012-02-27T10:55:19Z</updated>
    <author>
      <name />
    </author>
    <link rel="edit" title="Country" href="Countries(14)" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Region" type="application/atom+xml;type=entry" title="Region" href="Countries(14)/Region" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Contact_Country" type="application/atom+xml;type=feed" title="Contact_Country" href="Countries(14)/Contact_Country" />
    <category term="HpSalesPortalMobileDBModel.Country" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <content type="application/xml">
      <m:properties>
        <d:Id m:type="Edm.Int16">14</d:Id>
        <d:RegionId m:type="Edm.Byte">1</d:RegionId>
        <d:CountryName>France</d:CountryName>
      </m:properties>
    </content>
  </entry>
  <entry>
    <id>http://infra2appsmobile.cloudapp.net/Infra2Apps.svc/Countries(15)</id>
    <title type="text"></title>
    <updated>2012-02-27T10:55:19Z</updated>
    <author>
      <name />
    </author>
    <link rel="edit" title="Country" href="Countries(15)" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Region" type="application/atom+xml;type=entry" title="Region" href="Countries(15)/Region" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Contact_Country" type="application/atom+xml;type=feed" title="Contact_Country" href="Countries(15)/Contact_Country" />
    <category term="HpSalesPortalMobileDBModel.Country" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <content type="application/xml">
      <m:properties>
        <d:Id m:type="Edm.Int16">15</d:Id>
        <d:RegionId m:type="Edm.Byte">1</d:RegionId>
2012-02-27 16:25:18.933 SampleTest[571:f803] >>>>>>>>>>  Route data <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xml:base="http://infra2appsmobile.cloudapp.net/Infra2Apps.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Countries</title>
  <id>http://infra2appsmobile.cloudapp.net/Infra2Apps.svc/Countries</id>
  <updated>2012-02-27T10:55:19Z</updated>
  <link rel="self" title="Countries" href="Countries" />
  <entry>
    <id>http://infra2appsmobile.cloudapp.net/Infra2Apps.svc/Countries(14)</id>
    <title type="text"></title>
    <updated>2012-02-27T10:55:19Z</updated>
    <author>
      <name />
    </author>
    <link rel="edit" title="Country" href="Countries(14)" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Region" type="application/atom+xml;type=entry" title="Region" href="Countries(14)/Region" />
    <link rel="h

hi martin i have use your code like below but i unable to parsing the data i mean can't able to parse the specific data like id, RegionId and Countryname also it is not entering into the for(){}. give me the solution for how to parse the data.

NSArray *array=[thexml componentsSeparatedByString:@""]; NSLog(@"%d",[array count]); NSLog(@"------------->>>>>>>>>>>23344<<<<<<<<<---------%d",[array count]); // NSString *str1=[array objectAtIndex:0]; //
// NSArray *array1=[str1 componentsSeparatedByString:@""]; // NSLog(@"%d",[array1 count]); for(int i=1;i<[array count];i++) { NSLog(@"------------->>>>>>>---------%d",[array count]);

        NSString *str=[array objectAtIndex:i];
        NSLog(@"------------->>>>>>>>><<<<<<<<<---------%@",str);
        NSArray *arr1=[str componentsSeparatedByString:@"<text>"];
        NSLog(@"------------->>>>>>>>>>>1111<<<<<<<<<---------%@",arr1);

        NSString *data=[arr1 objectAtIndex:1];
        NSRange ranfrom=[data rangeOfString:@"</text>"];
        // nt.truckName=[data substringToIndex:ranfrom.location];
        [tweets  addObject:[data substringToIndex:ranfrom.location]];
        NSLog(@"------------->>>>>>>>>>>2222<<<<<<<<<---------%@",tweets);
    }

2012-02-28 13:38:38.609 SampleTest[358:f803] ------------->>>>>>>><<<<<<<<<---------1

Community
  • 1
  • 1
laxmanperamalla
  • 551
  • 2
  • 5
  • 15
  • You really need to look at the preview of your question before posting. Before my edit, your XML wasn't in a code block so it just looked like `Countries http://infra2appsmobile.cloudapp.net/Infra2Apps.svc/Countries 2012-02-27T10:55:19Z` and so on, with none of the XML tags showing up. – yuji Feb 27 '12 at 11:05
  • What is the source of this Xml? I am asking bcoz we can use soap parsing. it will ease your work of parsing. – Rupesh Feb 27 '12 at 11:08
  • 1
    Perhaps you should do a search on *parsing xml files in iphone*? – Peter Sarnowski Feb 27 '12 at 11:09
  • Answered a similar question like 2 hours ago ,http://stackoverflow.com/a/9462076/876283, searching is good habit. – iNoob Feb 27 '12 at 11:10
  • You can use [NSXMLParser](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html) to parse the information from an XML file. – James Webster Feb 27 '12 at 11:05
  • i dont prefer NSXMLParser for this xml structure use touch or tb xml parser instead... – nik Feb 27 '12 at 13:32

2 Answers2

1

NSXMLParser is the best solution.

Declare a delegate class with NSXMLParserDelegate

@interface myXMLReader : NSObject <NSXMLParserDelegate> 

Implement the parsing methods in your delegate class

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    ...
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    ...
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    ...
}

And start your parsing.

NSData * kmlData = [NSData dataWithContentsOfFile:urlOfXml];
if(kmlData != nil){
    NSXMLParser * parser  = [[NSXMLParser alloc] initWithData:kmlData];
    [parser setDelegate:self];
    [parser parse]; 
    [parser release];
}

Enjoy

Martin
  • 11,881
  • 6
  • 64
  • 110
1

Well I parse xml some different way than others and being frank I really do not know which technique it is but I assure you it works fine for me and I have implemeted it successfully in so many projects. Have a look at my code where I load tweets from some profile

This is the function where I make call for parser.

-(void)loadtweet
{
@try
{
    NSString *urlString = [NSString stringWithFormat:@"https://api.twitter.com/1/statuses/user_timeline.xml?screen_name=SrBachchan&count=5"];

    NSLog(@"fetching data from--------> : %@",urlString);

    NSString* escapedUrlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

    NSMutableURLRequest *request1 = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:escapedUrlString]];

    NSURLConnection *con=[[NSURLConnection alloc]  initWithRequest:request1 delegate:self];
    if(con)
        truckData=[[NSMutableData data]retain];
}

@catch (NSException *exception) 
{
    UIAlertView *v = [[UIAlertView alloc] initWithTitle:@"ERROR" message:@"Please Try Again Later." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [v show];
    [v release];
}

}

And these are the NSURLConnection delegate methods:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[truckData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{
[truckData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

{
   [tweets removeAllObjects];
 @try 
{
    // [app.trucks removeAllObjects];
    NSString *thexml=[[NSString alloc] initWithBytes:[truckData mutableBytes] length:[truckData length] encoding:NSUTF8StringEncoding];

    NSArray *array=[thexml componentsSeparatedByString:@"<status>"];
    NSLog(@"%d",[array count]);

    for(int i=1;i<[array count];i++)
    {
        NSString *str=[array objectAtIndex:i];
        NSArray *arr1=[str componentsSeparatedByString:@"<text>"];
        NSString *data=[arr1 objectAtIndex:1];
        NSRange ranfrom=[data rangeOfString:@"</text>"];
        // nt.truckName=[data substringToIndex:ranfrom.location];
        [tweets  addObject:[data substringToIndex:ranfrom.location]];
    }
}

@catch (NSException *exception) 
{
    UIAlertView *v = [[UIAlertView alloc] initWithTitle:@"ERROR" message:@"Please Try Again Later." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [v show];
    [v release];
 }

}

I have used some string functions to separate tags and stored the values in Array.

rohan-patel
  • 5,772
  • 5
  • 45
  • 68