I'm attempting to parse a large amount of XML data from a SOAP web service and then display it in a UITableView.
When the service is called, this is the XML output from NSLog:
<Country><Name>Argentina</Name><Capital>Buenos Aires</Capital></Country>
<Country><Name>Australia</Name><Capital>Canberra</Capital></Country>
<Country><Name>Brazil</Name><Capital>Brasilia</Capital></Country>
<Country><Name>Canada</Name><Capital>Ottawa</Capital></Country>
<Country><Name>Costa Rica</Name><Capital>San Jose'</Capital></Country>
Here's the offending code.
.h
NSMutableArray *countryListArray; // main array used in tableview
NSMutableDictionary *countryDict; // a temporary item added to the "countryListArray" array one at a time, and cleared for the next one
// this parses through the document, from top to bottom...
// collects and caches each sub-element value, and then save each item to our array.
// we use these to track each current item, until it's ready to be added to the "countryListArray" array
NSString *currentCountry;
NSMutableString *currentName;
NSMutableString *currentCapital;
.m
- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict {
currentCountry = [elementName copy];
if( [elementName isEqualToString:@"Country"]) {
countryDict = [[[NSMutableDictionary alloc] init] autorelease];
currentName = [[[NSMutableString alloc] init] autorelease];
currentCapital = [[[NSMutableString alloc] init] autorelease];
}
}
- (void)parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"Country"]) {
[countryDict setObject:currentName forKey:@"Name"];
[countryDict setObject:currentCapital forKey:@"Capital"];
[countryListArray addObject:[countryDict copy]];
NSLog(@"countryListArray= %@", countryListArray);
}
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"found characters: %@", string);
if ([currentCountry isEqualToString:@"Name"]) {
[currentName appendString:string];
} else if ([currentCountry isEqualToString:@"Capital"]) {
[currentCapital appendString:string];
}
}
- (void)connectionDidFinishLoading:(NSURLConnection *) connection {
countryListArray = [[NSMutableArray alloc] init];
NSLog(@"DONE. Received Bytes: %d", [webData length]);
NSString *theXML = [[NSString alloc] initWithBytes:[webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
//---shows the XML---
NSLog(@"theXML=%@",theXML);
[theXML release];
if (xmlParser){
[xmlParser release];
}
xmlParser = [[[NSXMLParser alloc] initWithData:webData] autorelease];
[xmlParser setDelegate: self];
[xmlParser setShouldProcessNamespaces:NO];
[xmlParser setShouldReportNamespacePrefixes:NO];
[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];
[connection release];
[webData release];
NSLog(@"countryListArray has %d items", [countryListArray count]);
}
My issue this that this bit of code doesn't parse the data as I expect it to. Instead of this(Do Want):
countryListArray=(
{Name = "Argentina"; Capital = "Buenos Aires";},
{Name = "Australia"; Capital = "Canberra";} ,
{Name = "Brazil"; Capital = "Brasilia";} ,
{Name = "Canada"; Capital = "Ottawa";} ,
{Name = "Costa Rica"; Capital = "San Jose";}
)
countryListArray has 5 items
In NSLog, I get this(Do Not Want):
countryListArray=(
{Name = "Argentina Australia Brazil Canada Costa Rica";
Capital = "Buenos Aires Canberra Brasilia Ottawa San Jose'";}
)
countryListArray has 1 items
Any ideas on what I'm doing wrong? Yes... I know about the memory leaks, not worried about that right now.
Any help is appreciated.