Количество массивов равно 1 после синтаксического анализа XML iPhone

#iphone #objective-c #xml #xcode

#iPhone #objective-c #xml #xcode

Вопрос:

Я анализирую время полета в своем приложении для iPhone.

Вот фрагмент из XML

 <?xml version="1.0" encoding="iso-8859-1"?>
<airport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<flights lastUpdate="2011-11-07T10:49:43">
<flight uniqueID="2131560">
  <airline>DY</airline>
  <flight_id>DY1052</flight_id>
  <dom_int>S</dom_int>
  <schedule_time>2011-11-04T06:00:00</schedule_time>
  <arr_dep>D</arr_dep>
  <airport>SVG</airport>
  <via_airport>CPH</via_airport>
  <check_in>C</check_in>
</flight>
<flight uniqueID="2136807">
  <airline>SK</airline>
  <flight_id>SK308</flight_id>
  <dom_int>D</dom_int>
  <schedule_time>2011-11-07T07:15:00</schedule_time>
  <arr_dep>D</arr_dep>
  <airport>SVG</airport>
  <via_airport>SVG</via_airport>
  <check_in>EF</check_in>
</flight>
...
  

Я сохраняю каждый рейс в объекте Flight, который выглядит следующим образом:

 @interface Flights : NSObject{
NSInteger flightUniqueID;
NSString *airline;
NSString *flight_id;
NSString *dom_int;
NSDate *schedule_time;
NSString *arr_dep;
NSString *airport;
NSString *check_in;
NSString *status;
NSString *via_airport;
NSString *gate;
NSString *delayed;

}
@property(nonatomic, readwrite)NSInteger flightUniqueID;
@property(nonatomic, retain)NSString *airline;
@property(nonatomic, retain)NSString *flight_id;
@property(nonatomic, retain)NSString *dom_int;
@property(nonatomic, retain)NSDate *schedule_time; 
@property(nonatomic, retain)NSString *arr_dep;
@property(nonatomic, retain)NSString *airport;
@property(nonatomic, retain)NSString *check_in;
@property(nonatomic, retain)NSString *status;
@property(nonatomic, retain)NSString *via_airport;
@property(nonatomic, retain)NSString *gate;
@property(nonatomic, retain)NSString *delayed;
  

Я использую NSXMLParser для анализа XML

 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
attributes:(NSDictionary *)attributeDict{

if ([elementName isEqualToString:@"airport"]) {
    allFlights = [[NSMutableArray alloc]init];
}
else if([elementName isEqualToString:@"flight"]){
    flight = [[Flights alloc]init];

    flight.flightUniqueID = [[attributeDict objectForKey:@"uniqueID"]integerValue];

}

}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
  if(!currentElementValue) 
    currentElementValue = [[NSMutableString alloc] initWithString:string];
else
    [currentElementValue appendString:string];


}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

if ([elementName isEqualToString:@"flights"]) {
    return;
}
if ([elementName isEqualToString:@"flight"]) {
    NSLog(@"Adding object: %@" , flight);
    [allFlights addObject:flight];

    [flight release];
    flight = nil;
}else
    [flight setValue:currentElementValue forKey:elementName];

   [currentElementValue release];
currentElementValue = nil;
}
  

Когда я регистрирую «полет», я получаю этот вывод:

 Adding object: <Flights: 0xsomenumber>
...
Adding object: <Flights: 0x7064360>
  

это продолжается для любого количества рейсов, которые есть в xml.

Однако массив, в который я добавляю каждый объект, хранит только последний объект flight. Если я попытаюсь выполнить NSLog массива после завершения синтаксического анализа, он распечатает последний объект и больше ничего.

Очевидно, что мне нужно сохранить все рейсы в массиве, чтобы я мог показать их все в своем tableview после завершения синтаксического анализа.

Как я могу этого добиться? Я что-то упускаю?

Я попытался проанализировать XML, не выпуская объект flight, но это тоже не сработало.

Ответ №1:

Вы устанавливаете allFlights в пустой массив для элементов airport. Я предполагаю, что вы хотите инициализировать его один раз при запуске.

Однако в каждом элементе flight есть вложенные элементы airport, поэтому в итоге вы получаете только последний рейс. Попробуйте инициализировать allFlights где-нибудь еще.

Комментарии:

1. Я инициализировал его в своем методе loadView, теперь он работает как шарм. Не могу поверить, что я не пробовал этого до публикации моего вопроса. В любом случае, спасибо, приятель!

Ответ №2:

После завершения операции синтаксического анализа попробуйте

 NSLog(@"the number of objects are -> %d", [Your Array object count]);
  

и посмотрите, что это показывает?????

Если он показывает правильное количество объектов, это означает, что добавлены все объекты. и вы можете распечатать их, используя цикл, например

 for (Flight *objFlight in arrFlights)
{
    NSLog (@"Flight Name -> %@",objFlight.strFlihtName);
}
  

Удачного кодирования…