#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);
}
Удачного кодирования…