2011-01-11 2 views
2

У меня есть приложение, которое должно загружать данные с удаленного сервера (предприятия по местоположению) и отображать их на карте. Канал с сервера основан на XML. Я успешно выполнил эту задачу, но подумал, могу ли я сделать свою жизнь немного легче.iOS: простой способ доступа к записям данных XML?

В настоящее время я использую GDataXML-библиотеку Google, я внедрил библиотеку для получения удаленных данных в фоновом режиме, и она вызывает меня по завершении или во время загрузки, если я захочу.

Когда все данные были загружены, я пересекаю документ и конвертирую различные уровни в объект, добавляя этот объект к 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-элемент в каждом узле и вручную переносить их на объект BusinessRecord.

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

Под 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 позже, когда люди заполняют формы.

Вся помощь или толкает в правильном направлении.

ответ

1

Вариант 1:

Вы можете создать свой собственный метод инициализации для businessrecord класса, который принимает GDataXMLElement аргумент и разобрать значения, нужно использовать некоторые XPath выражения, которые немного более приятным на глаз;)

Вариант 2:

Для достижения PHP-как массив ассоциативных массивов, вы можете: Итерация по массиву элементов «бизнес», и перебирать детей каждого бизнес-элемента, используя имена ребенка элементов как ключи для вашего NSMutable Словарь бизнес-записей - и закрепил только что созданный словарь в массиве businessList.

/* THIS IS JUST A QUICK PSEUDO-CODE-ISH SAMPLE */ 
NSArray *businesses = [xmlRoot nodesForXPath:@"//businesses/business" error:nil]; 
NSMutableArray *businessList = [[NSMutableArray alloc] initWithCapacity: businesses.count]; 

GDataXMLElement *business; 

for (business in businesses) 
{ 
    NSMutableDictionary *businessRecord = [[NSMutableDictionary] array]; 

    // iterate over child elements of "business", use element names as keys for businessRecord 
    NSArray *businessChildren = [business children];  
    GDataXMLElement *businessChild; 
    for (businessChild in businessChildren) 
    { 
     [businessRecord setValue:[businessChild value] forKey:[businessChild name]] 
    } 

    [businessList addObject:businessRecord]; 
    [businessRecord release]; 
} 

Я наткнулся на эту статью «How To Read and Write XML Documents with GDataXML», исследуя возможности для XML разбора, который был твердым читать, однако они разбор в конкретных модельных объектах, а не более общий объект данных, как вы ищете.

Вы должны проверить свою другую статью «How To Choose The Best XML Parser For Your iPhone Project», поскольку GDataXML кажется излишним.

Смежные вопросы