简体   繁体   中英

NSXML Not parsing values for entries

I have an iPhone app that I'm building which goes out and gets a xml file and then parses data from it to create objects. For some odd reason though the text I try to parse out always has a value of nil.

/*
 Sample entry
 <course> 
 <name>Afton Alps Golf Course</name> 
 <address>6600 Peller Ave S, Hastings, MN 55033</address> 
 <desc>This is only a test</desc> 
 <rating>69</rating> 
 <location>42.12452 -90.53 </location>
 <course>
*/
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    attributes:(NSDictionary *)attributeDict {
  if(nil != qName) {
    elementName = qName; // swap for the qName if we have a name space
  }

  if ([elementName isEqualToString:@"course"]) {
    self.currentCourse = [[[Course alloc] init] autorelease];
  } else {
      self.propertyValue = nil;
  }
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
  if(nil != self.propertyValue) {
    [self.propertyValue appendString:string];
  }
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {     
  if (qName) {
    elementName = qName; // switch for the qName
  }
  if ([elementName isEqualToString:@"name"]) {
      self.currentCourse.name = self.propertyValue;
  } else if ([elementName isEqualToString:@"address"]) {
      self.currentCourse.address = self.propertyValue;
  } else if ([elementName isEqualToString:@"desc"]) {
      self.currentCourse.description = self.propertyValue;
  } else if ([elementName isEqualToString:@"rating"]) {
      NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
      [f setNumberStyle:NSNumberFormatterDecimalStyle];
      self.currentCourse.rating = [f numberFromString: self.propertyValue];
      [f release];
  } else if ([elementName isEqualToString:@"location"]) {
      NSArray *comp = [self.propertyValue componentsSeparatedByString:@" "];
      NSLog( @"%s", [comp objectAtIndex:0]);
      NSLog( @"%s", [comp objectAtIndex:1]);
      NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
      NSNumber *latitude = [formatter numberFromString:[comp objectAtIndex:0]];
      NSNumber *longitude = [formatter numberFromString:[comp objectAtIndex:1]];
      [formatter release];
      CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude.floatValue
                                                        longitude:longitude.floatValue];
      self.currentCourse.location = location;
      [location release];
  } else if([elementName isEqualToString:@"course"]) {
      NSLog(@"We're done");
      [(id)[self delegate] performSelectorOnMainThread:@selector(addCourse:)
                                            withObject:self.currentCourse
                                         waitUntilDone:NO];
  }

}

**

Look at this code in the data recieved callback :

if(nil != self.propertyValue) {
    [self.propertyValue appendString:string];
}

You never set propertyValue anywhere (I assumed that it would be set in the startElement method but it's not) so you never append the data.

Every time you start an element, you're setting propertyValue to nil. When you find characters, self.propertyValue is nil.

Try this in your parser:foundCharacters: message, instead:

    if( self.propertyValue == nil )
    {
        self.propertyValue = [NSString stringWithString:string];
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM