У меня есть приложение, которое должно загружать данные с удаленного сервера (предприятия по местоположению) и отображать их на карте.Канал с сервера основан на XML.Я успешно выполнил реализацию этого, но подумал, смогу ли я сделать свою жизнь немного проще.
В настоящее время я использую библиотеку Google GDataXML, я реализовал библиотеку для получения удаленных данных в фоновом режиме, и она вызываетя возвращаюсь после завершения или во время загрузки, если хочу.
Когда полные данные загружены, я пересекаю документ и преобразую различные уровни в объект, добавляя этот объект в NSMutableArray (как я хочувыполнить ленивую загрузку, поэтому я хочу добавить, когда запрашивается больше), а затем передать этот массив следующему биту моего приложения, который затем интерпретирует и прикрепляет / аннотирует карту для меня.
Пример данных XML (абстрагированный):
<businesses>
<business>
<name> Fred Bloggs and Co </name>
<address> 123 No Street, Nowhere </address>
<town> Somesville </town>
<county> Someshire </county>
<postcode> XX11 1XX </postcode>
</business>
..... more records but you get the idea .....
</businesses>
Пример объекта хранения (абстрагированный)
-- businessrecord.h --
@interface BusinessRecord : NSObject {
NSString *name;
NSString *address;
NSString *town;
NSString *county;
NSString *postcode;
}
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *address;
@property (nonatomic, copy) NSString *town;
@property (nonatomic, copy) NSString *county;
@property (nonatomic, copy) NSString *postcode;
@end
-- businessrecord.m --
@implementation BusinessRecord
@synthesize name, address, town, county, postcode;
@end
Верно, так что вы можете догадаться, что я вручную анализирую каждый элемент XML в каждом узле и вручную переношу их в BusinessRecordobject.
Это особенно отнимает много времени, так как мне нужно написать три или более строк кодав разных местах для каждого свойства.
В GDataXML вы получаете доступ к каждому элементу с помощью чего-то вроде:
NSArray *businesses = [[[xmlRoot elementsForName:@"businesses"] objectAtIndex:0] elementsForName:@"business"];
NSMutableArray *businessList = [[NSMutableArray alloc] initWithCapacity: businesses.count];
for (int i=0; i<businesses.count; i++) {
GDataXMLElement *business = [businesses objectAtIndex: i];
BusinessRecord *busRec = [[BusinessRecord alloc] init];
busRec.name = [[[bus elementsForName:@"name"] objectAtIndex:0] stringValue];
.... etc for each element ...
[businessList addObject: busRec];
[busRec release];
}
Мне кажется, это все очень долго, должен быть лучший способ сделать это?
Что я хочу закончить, так это все, что есть в моем XML на уровне «бизнес» в неком массиве произвольного доступа, я не хочу индивидуально указывать каждый элемент.
В идеале, что-то вроде PHP, где вы можете просто иметь последовательный массив, содержащий ассоциативные массивы, такие как:
$businessList = Array(
Array(
"name" => "Fred Bloggs and Co",
"address" => "123 No Street",
"town" => "Sometown",
"county" => "Someshire",
"postcode" => "XX11 1XX"
)
);
Так что я предполагаю, что мне нужно написать класс-обертку, который может интерпретировать определенный элемент и получить все егоправильные подэлементы (то есть, перечислите элементы и затем работайте с ними).
В чем я храню это?NSDictionary?
Может быть что-то вроде (псевдокод):
NSArray *businesses = [[[xmlRoot elementsForName:@"businesses"] objectAtIndex:0] elementsForName:@"business"];
NSMutableArray *businessList = [[NSMutableArray alloc] init];
[xmlBreakerUpper breakUpXMLAtElement: businesses addToMutableArray: &businessList];
Кто-нибудь имеет опыт работы с GDataXML и может помочь мне с перечислением, так как я не могу следить за разреженной документацией.
На данном этапе я не полностью привязан к GDataXML, у меня есть только два класса, на которые можно рассчитывать, поэтому, если есть лучший способ.
Я контролирую вывод сервера, но клиент имеетпредпочтение XML для других API доступа к данным, которые они могут или не захотят реализовать позже.
Мне не нужно отправлять XML обратно на сервер на данном этапе, запросы в настоящее время основаны на HTTP GET, номожет стать POST позже, когда люди заполняют формы.
Вся помощь или толчки в правильном направлении получаются с большим удовольствием.