iOS: простой способ доступа к записям данных XML? - PullRequest
2 голосов
/ 11 января 2011

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

Вся помощь или толчки в правильном направлении получаются с большим удовольствием.

1 Ответ

1 голос
/ 01 февраля 2011

Вариант 1:

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

Вариант 2:

Чтобы получить PHP-подобный массив ассоциативных массивов, вы можете: Выполните итерацию по массиву «бизнес» элементов и итерацию по дочерним элементам каждого бизнес-элемента, используя имена дочерних элементов в качестве ключей для вашей бизнес-записи NSMutableDictionary - и сохраните вновь созданный словарь в массиве 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];
}

Я наткнулся на эту статью " Как читать и писать документы XML с помощью GDataXML ", исследуя варианты синтаксического анализа XML, который был сплошным чтением, однако они разбираются в определенных объектах модели, а не универсальный объект данных, который вы ищете.

Вам следует ознакомиться с другой их статьей " Как выбрать лучший анализатор XML для вашего проекта iPhone ", поскольку GDataXML выглядит излишним.

...